2012-05-10 14 views
17

ऑटोवायर नहीं कर सका, मैंने स्प्रिंग डेटा जेपीए के साथ काम करने के लिए आधार आवेदन प्राप्त करने के लिए here पोस्ट किए गए ट्यूटोरियल का पालन किया। अब, मैं कैसे समझ में आया, विन्यासस्प्रिंग डेटा जेपीए - इंजेक्शन विफल रहता है - बीनक्रिएशन अपवाद: क्षेत्र

<jpa:repositories base-package="my.package.to.scan" /> 

का उपयोग कर कि पैकेज JpaRepository विस्तार इंटरफेस के लिए स्प्रिंग डाटा जेपीए द्वारा स्कैन किया जा रहा में परिणाम और इसलिए यह आसान का उपयोग कर मेरी सेवा की कक्षाओं में कहीं भी इस्तेमाल किया जा सकता इसके बारे में एक concreate सेम बनाना चाहिए वसंत @Autowired। लेकिन यह विफल रहता है, कह रहा है कि यह कक्षा नाम के साथ एक बीन नहीं ढूंढ सकता है (जो कि डी-कैपिटल क्लासनाम का उपयोग करते हुए बीन बनने का डिफ़ॉल्ट नाम है)।

हालांकि, जब मैं इस तरह मेरे applicationContext में manualy सेम कॉन्फ़िगर करें:

<bean id="ClassName" class="my.package.to.scan.ClassName"/> 

वसंत सेम को खोजने के लिए सक्षम है। मैं निश्चित रूप से एक त्रुटि प्राप्त करता हूं क्योंकि मैं एक इंटरफ़ेस से एक बीन बनाना चाहता हूं, जो स्पष्ट रूप से काम नहीं कर सकता है। लेकिन मुद्दा यह है कि ऐसा लगता है कि स्प्रिंग डेटा जेपीए "स्वचालित बीन निर्माण" किसी भी तरह विफल होने लगता है।

मैंने प्रासंगिक कोड संलग्न किया ताकि आप इसे देख सकें। बीटीडब्ल्यू, मुझे जिक्र करना चाहिए कि मैं एक पोर्टल विकसित कर रहा हूं, इसलिए आश्चर्य न करें कि मेरे पास वसंत-कॉन्फ़िगर क्यों नहीं है। मैं वर्तमान में पोर्टल कॉन्फ़िगरेशन के लिए केवल एक MyPortlet-Portlet.xml के साथ एक एप्लीकेशन कॉन्फिग का उपयोग कर रहा हूं (लेकिन यह इस समस्या के लिए रिलीज़ नहीं होना चाहिए)। मैंने यह सुनिश्चित करने के लिए केवल आयात विवरणों को जोड़ा है कि मैं गलत एनोटेशन/कक्षाओं का उपयोग नहीं कर रहा हूं।

applicationContext.xml

<beans *** ALL MY XMLN's and XSI's *** /> 
<context:annotation-config /> 
<jpa:repositories base-package="model.repositories" /> 

// JPA specific configuration here: dataSource, persistenceUnitManager exceptionTranslator, entityManagerFactory, SessionFactory, transactionManager - should not be relevant for this problem, tell me if i'm wrong 

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

ICustomerService - customerservice

import model.entities.Customer; 
public interface ICustomerService { 
     // example method 
    public Customer getCustomer(Long customerId); 
} 

customerservice के लिए सिर्फ एक इंटरफ़ेस - वर्ग अपने आवेदन तर्क द्वारा प्रयोग किया जाता करने के लिए मिल/सेट ORM डेटा

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.data.domain.Page; 
import org.springframework.data.domain.Pageable; 
import org.springframework.stereotype.Repository; 
import org.springframework.transaction.annotation.Transactional; 
import model.entities.Customer; 
import model.repositories.CustomerRepository; 
import model.service.interfaces.ICustomerService; 
@Repository 
@Transactional(readOnly = true) 
public class CustomerService implements ICustomerService{ 
    @Autowired 
    private CustomerRepository repository; 

    // example method 
    @Override 
    public Customer getCustomer(Long customerId){ 
     return repository.findById(customerId); 
    } 

CustomerRepository - स्प्रिंग डाटा जेपीए

import javax.annotation.Resource; 
import org.springframework.data.jpa.repository.JpaRepository; 
import org.springframework.transaction.annotation.Transactional; 
import model.entities.Customer; 
@Resource 
@Transactional(readOnly = true) 
public interface CustomerRepository extends JpaRepository<Customer, Long>{ 

    public Customer findById(Long id); 
} 

ग्राहक के लिए भंडार - मेरी नमूना इकाई

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name = "Customers") 
public class Customer{ 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(name = "ID_CUSTOMER") 
    private Long id; 

    @Column(name = "dbfirstname") 
    private String firstName; 

    @Column(name = "dbname") 
    private String lastName; 

    public Long getId(){ 
     return id; 
    } 

    public String getFirstName(){ 
     return firstName; 
    } 

    public void setFirstName(String firstName){ 
     this.firstName = firstName; 
    } 

    public String getLastName(){ 
     return lastName; 
    } 

    public void setLastName(String lastName){ 
     this.lastName = lastName; 
    } 
} 

मैं सिर्फ WebSphere (लानत, क्या एक फू के साथ classpath नरक से आया * * एड अप उत्पाद) और अब मैं यहाँ हूँ। उम्मीद है कि कोई मेरी मदद कर सकता है।

क्या स्पष्ट रूप से गलत हो जाता है और शायद स्प्रिंग्स की बेहतर समझ प्रदान करने के लिए एक स्पष्ट स्पष्टीकरण इंजेक्शन सुविधा बहुत अच्छी होगी। मैंने वसंत दस्तावेज पढ़ा है, लेकिन सत्य कहने के लिए: कुछ कॉन्फ़िगर करने के कई तरीके हैं और यह मेरे लिए बिल्कुल दिखाई नहीं दे रहा है कॉन्फ़िगरेशन शैलियों में से किसी एक को चुनते समय वास्तव में क्या आवश्यक है।

संपादित

परियोजना मैं अभी भी त्रुटि मिल रही है अद्यतन करने के लिए प्रयास करने के बाद।के रूप में यहाँ का अनुरोध किया थोड़ा और अधिक विवरण (ट्रेस):

Exception created : org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customerService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private model.repositories.CustomerRepository model.service.CustomerService.repository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customerRepository': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) 
    [...] 
     at com.ibm.ws.http.HttpConnection.run(HttpConnection.java:522) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1563) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private model.repositories.CustomerRepository model.service.CustomerService.repository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customerRepository': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:506) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284) 
    ... 96 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'customerRepository': FactoryBean threw exception on object creation; nested exception is java.lang.NullPointerException 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149) 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:102) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1442) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:248) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:848) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:790) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:707) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478) 
    ... 98 more 
Caused by: java.lang.NullPointerException 
    at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus(JtaStatusHelper.java:73) 
    at org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.isActive(JtaStatusHelper.java:115) 
    at org.hibernate.engine.transaction.internal.jta.CMTTransaction.join(CMTTransaction.java:149) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.joinTransaction(AbstractEntityManagerImpl.java:1215) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.postInit(AbstractEntityManagerImpl.java:177) 
    at org.hibernate.ejb.EntityManagerImpl.<init>(EntityManagerImpl.java:89) 
    at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:179) 
    at org.hibernate.ejb.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:174) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:48) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:600) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:376) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:517) 
    at $Proxy325.createEntityManager(Unknown Source) 

    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:234) 
    at $Proxy328.createNamedQuery(Unknown Source) 
    at org.springframework.data.jpa.repository.query.NamedQuery.<init>(NamedQuery.java:74) 
    at org.springframework.data.jpa.repository.query.NamedQuery.lookupFrom(NamedQuery.java:96) 
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:128) 
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:162) 
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:71) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:303) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:157) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:120) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:39) 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142) 

संपादित करें # 2 compleate applicationContext.xml (परिवर्तन मैं चल रही चर्चा के आधार पर किया includeing) के रूप में अनुरोध

<context:annotation-config /> 

<jpa:repositories base-package="model.repositories" /> 

<context:component-scan base-package="model,model.repositories,model.service,controller" /> 

<bean class="model.service.CustomerService"/> 
<bean class="model.service.OrderService"/> 
<bean class="model.repositories.CustomerRepository"/> 
<bean class="model.repositories.OrderRepository"/> 


<bean id="myExceptionTranslator" class="org.springframework.orm.hibernate4.HibernateExceptionTranslator" /> 

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/mydata" 
    resource-ref="true" cache="true" /> 


<bean id="pum" 
    class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
    <property name="persistenceXmlLocations"> 
     <list> 
      <value>classpath*:META-INF/OverridePersistence.xml</value> 
     </list> 
    </property> 
    <property name="defaultDataSource" ref="dataSource" /> 
</bean> 


<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="generateDdl" value="true" /> 
      <property name="database" value="MYSQL" /> 
     </bean> 
    </property> 
    <property name="persistenceUnitManager" ref="pum" /> 
    <property name="persistenceUnitName" value="default" /> 
</bean> 

<bean id="mySessionFactory" 
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="packagesToScan" value="model"/> 
    <property name="hibernateProperties"> 
     <value>hibernate.dialect=org.hibernate.dialect.MySQLDialect</value> 
    </property> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    <property name="sessionFactory" ref="mySessionFactory" /> 
</bean> 

<tx:annotation-driven /> 

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 
+0

आपके ग्राहक रिपोजिटरी को संसाधन एनोटेशन की आवश्यकता नहीं है। साथ ही, findById को पहले से ही JpaRepository द्वारा प्रदान किया जाना चाहिए। मैं आपकी इकाई मान रहा हूं प्रबंधक बिना त्रुटियों के ठीक बनाया गया है। के साथ पर्याप्त होना चाहिए। स्प्रिंग क्लास के लिए अपना डीबग लॉग चालू करें और जांचें कि वहां कुछ त्रुटि है या नहीं। – Luciano

+0

सेवा ग्राहक एनोटेशन के बजाय आपके ग्राहक सेवा में रिपोजिटरी एनोटेशन क्यों है? – Luciano

+0

रयान स्टीवर्ट के उत्तर पर मेरी टिप्पणियों की जांच करें। मूल रूप से क्योंकि मैंने ट्यूटोरियल का पालन किया जो अधूरा लगता है। – masi

उत्तर

19

जोड़ा समस्या कुछ ऐसी कॉन्फ़िगरेशन में है जो आपने नहीं दिखाई है। यदि आप जो त्रुटि प्राप्त कर रहे हैं उसे पोस्ट करना भी अच्छा होगा। यह आपके विचार से भिन्न कुछ हो सकता है।

आपकी कॉन्फ़िगरेशन के बारे में एक बात यह है कि आपके बजाय context:annotation-config का उपयोग कर रहे हैं। उत्तरार्द्ध @Component एनोटेशन के परिवार के आधार पर सेम का पता लगाएगा और बीन्स बनाएगा। पूर्व ऐसा नहीं करता है।

इसके अलावा, आपके द्वारा पोस्ट की गई हर चीज यह दिखती है कि यह काम करना चाहिए, हालांकि कई अजीब चीजें हैं, जो मैं एक पल में आऊंगा। मैंने आपके सभी पोस्ट कोड को एक नमूना प्रोजेक्ट में कॉपी किया है और कुछ विवरणों में भरा है, जैसे maven pom, persistence.xml, और the applicationContext.xml के अनुपलब्ध टुकड़े। मैंने सेवा के लिए "निर्माण" विधि भी जोड़ दी है, इसलिए यह वास्तव में कुछ करेगी। जगहों और मुख्य वर्ग को उन सभी के साथ चलाने के लिए, यह एक चलने योग्य उदाहरण है। आप browse the code on github सकते हैं या आप क्लोन और साथ चला सकते हैं: विषमताएं कि मैंने देखा है के लिए अब

git clone git://github.com/zzantozz/testbed tmp 
cd tmp/stackoverflow/10539417-basic-spring-data-jpa 
mvn -q compile exec:java -Dexec.mainClass=rds.testbed.springDataJpa.SpringDataJp 

। ऊपर से:

  • कोड के रूप में दिया साथ, PersistenceAnnotationBeanPostProcessor कि आप applicationContext.xml में शामिल किया है की कोई जरूरत नहीं है। यह आपके लिए कुछ नहीं कर रहा है। बेशक, अन्य कोड भी हो सकते हैं जिनकी आपको आवश्यकता नहीं है।
  • @Repository आपके ग्राहक सेवा पर एनोटेशन supposed to be used on DAO classes है, या कक्षाएं जो डेटाबेस के साथ बातचीत करती हैं। सेवा के लिए उपयुक्त एनोटेशन @Service है।
  • @Resource आपके आईसी कस्टमर रिपोजिटरी पर एनोटेशन ज्यादातर used for marking fields and methods for autowiring है। मुझे यकीन नहीं है कि आपने इसे अपने भंडार इंटरफेस पर रखने के लिए क्या सोचा था, लेकिन यह वहां कुछ भी नहीं कर रहा है।
  • आपका भंडार @Transactional नहीं होना चाहिए। यह आपकी सेवा से संबंधित है, और आप इसे पहले से ही प्राप्त कर चुके हैं, तो यह ठीक है। ध्यान दें कि यह अभी भी @Transactional के साथ भंडार पर काम करता है क्योंकि यह सेवा द्वारा शुरू किए गए मौजूदा लेनदेन में शामिल होता है।
  • यह ध्यान देने योग्य है कि आप component scanning का उपयोग नहीं कर रहे हैं, भले ही आपके पास @Component-संबंधित एनोटेशन (@Repository आपकी सेवा पर) है। इससे आपको कुछ समस्याएं हो सकती हैं। घटक स्कैनिंग चालू करने के बजाय, मैंने नमूना प्रोजेक्ट में XML का उपयोग करके सेवा बीन मैन्युअल रूप से बनाई है।

तो ... अगर यह आप के लिए कुछ नहीं समझाया गया है, अगर तुम मुझे एक विशिष्ट त्रुटि देते हैं, मैं शायद व्याख्या कर सकते हैं क्यों तुम यह हो रही है और तुम बताओ क्या यह सही बनाने के लिए क्या करना है।

+0

मैं आपके कोड से गुज़र जाऊंगा और एक नज़र डालेगा। अब तक आपके प्रश्नों के लिए: - ठीक है, ऐसा लगता है कि मुझे दृढ़ता की आवश्यकता नहीं है एनीोटेशनबीनपोस्टप्रोसेसर। डीबगिंग के लिए मैं "कोशिश करता हूं और इसे हटाने के बाद आपको जो चाहिए उसे हटाएं" - रिपोजिटरी चीज़ अजीब है मुझे पता है। लेकिन मैंने जो ट्यूटोरियल पोस्ट किया है (मेरे प्रश्न में पहली वाक्य) कहता है कि यह सही है क्योंकि कक्षा एक रिपोजिटरी है, भले ही इसका नाम है - मैंने आईफ़ेस से संसाधन एनोटेशन हटा दिया - ट्यूटोरियल एनोटेशन ट्यूटोरियल में भी बताया गया है - मुझे नहीं पता था कि मुझे एनओएन conf – masi

+0

के घटक स्कैनिंग का उपयोग करना चाहिए, 'घटक-स्कैन' टैग ['एनोटेशन-कॉन्फ़िगरेशन 'का सुपरसेट है] (http://static.springsource.org/spring/ डॉक्स/3.0.x/वसंत-ढांचा-संदर्भ/html/beans.html # सेम-जावा-संयोजन-एक्सएमएल केंद्रित घटक स्कैन)। ऐसा करता है, साथ ही यह किसी भी '@ घटक' से संबंधित एनोटेशन द्वारा एनोटेटेड कक्षाओं के लिए स्कैन करता है। –

+0

आपके द्वारा पोस्ट किए गए ब्लॉग पोस्ट का तर्क है कि "सेवा" एक भंडार था क्योंकि इसमें एक EntityManager इंजेक्शन था, जिससे इसे पारंपरिक "भंडार" बना दिया गया था। इसने बाद में एक वास्तविक भंडार पेश करने के इरादे का भी उल्लेख किया, हालांकि यह इसके आसपास नहीं लग रहा है। आपकी ग्राहक सेवा को ग्राहक रिपोजिटरी से इंजेक्शन दिया जाता है, इसलिए स्पष्ट रूप से एक '@ सेवा' है और दूसरा '@ रिपोजिटरी 'है। –

संबंधित मुद्दे