복붙노트

[SPRING] 스프링 데이터 JPA - 주입이 실패합니다 - BeanCreationException : 필드를 자동 줄 바꿈 할 수 없습니다.

SPRING

스프링 데이터 JPA - 주입이 실패합니다 - BeanCreationException : 필드를 자동 줄 바꿈 할 수 없습니다.

나는 여기에 게시 된 튜토리얼을 따라 Spring Data JPA로 작업 할 기본 애플리케이션을 얻었다. 자, 어떻게 이해, 구성을 사용하여

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

그 패키지가 JpaRepository를 확장하는 인터페이스를 위해 Spring Data JPA에 의해 스캐닝되고 그것의 concreate 빈을 만들어야하므로 간단한 Spring @Autowired를 사용하여 서비스 클래스 내 어디서나 사용할 수있다. 그러나 className (bean이 생성 될 때 생성되는 기본 이름 인 de-capitalized ClassName을 사용)을 가진 bean을 찾을 수 없다고 말하는 것은 실패합니다.

그러나, 다음과 같이 applicationContext에서 수동으로 bean을 구성 할 때 :

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

Spring은 빈을 찾을 수있다. 물론 인터페이스에서 빈을 생성하기 때문에 에러가 발생합니다. 분명히 작동하지 않습니다. 하지만 요점은 Spring Data JPA "자동 bean 작성"이 어떻게 든 실패 할 것으로 보인다는 것입니다.

나는 당신이 그것을 볼 수 있도록 관련 코드를 첨부했다. Btw, 나는 포틀릿을 개발 중임을 언급해야한다. 그래서 왜 스프링 - 설정이 없는지 궁금하지 마라. 현재 portlet 구성을 위해 applicationConfig와 MyPortlet-Portlet.xml을 사용하고 있습니다 (그러나이 문제와 관련이 없어야합니다). 잘못된 주석 / 클래스를 사용하지 않도록 import 문을 추가했습니다.

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" />

EE 고객 서비스 - 고객 서비스를위한 인터페이스

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 - Spring Data JPA 저장소

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 (class)로 지옥에서 왔고, 지금 나는 여기에있다. 누군가가 이것으로 나를 도울 수 있기를 바랍니다.

exacly 무엇이 잘못되었는지에 대한 기본적인 설명과 스프링 자동 주입 기능에 대한 더 나은 이해를 제공하는 것이 좋을 것입니다. 스프링 문서를 읽었지만 진실을 말하면서 뭔가를 구성하는 방법이 너무 많아서 설정 스타일 중 하나를 선택할 때 실제로 필요한 것이 무엇인지 전혀 알 수 없습니다.

편집하다

프로젝트를 업데이트하려고 시도한 후에도 여전히 오류가 발생합니다. 여기에 요청한대로 좀 더 자세한 정보 (추적) :

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 번 수정 요청 된대로 추가 된 applicationContext.xml (진행중인 토론을 기반으로 한 변경 포함)

<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" />

해결법

  1. ==============================

    1.문제는 표시되지 않은 구성 중 일부에있을 가능성이 큽니다. 당신이 오류를 게시했다면 좋을 것입니다. 그것은 당신이 생각하는 것과 다른 뭔가일지도 모릅니다.

    문제는 표시되지 않은 구성 중 일부에있을 가능성이 큽니다. 당신이 오류를 게시했다면 좋을 것입니다. 그것은 당신이 생각하는 것과 다른 뭔가일지도 모릅니다.

    귀하의 설정에 대해 한 가지주의해야 할 것은 컨텍스트 : 구성 요소 스캔 대신 컨텍스트 : annotation-config를 사용한다는 것입니다. 후자는 @Component 어노테이션 패밀리를 기반으로 빈을 자동 감지하고 작성합니다. 전자는 그렇게하지 않습니다.

    그것 이외에, 당신이 올린 모든 것은 그것이 작동해야하는 것처럼 보입니다. 그러나 몇 가지 이상한 것들이 있습니다, 나는 잠시 후에 올 것입니다. 게시 된 모든 코드를 샘플 프로젝트에 복사하고 maven pom, persistence.xml 및 누락 된 applicationContext.xml과 같은 몇 가지 세부 사항을 채 웁니다. 나는 또한 실제로 뭔가를 할 수 있도록 서비스에 "create"메소드를 추가했다. 그것들을 모두 움직여야하는 주요 클래스와 그것들을 가지고 실행 가능한 예제입니다. 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
    

    이제 내가 알아 차린 기이 한 일들에 대해. 상단에서 :

    그래서 ... 이것이 당신에게 뭔가를 설명하지 않았다면, 당신이 나에게 특정한 오류를 주면, 나는 당신이 왜 그것을 얻고 있는지 그리고 당신이 그것을 올바르게하기 위해 무엇을해야 하는지를 설명 할 수있을 것입니다.

  2. from https://stackoverflow.com/questions/10539417/spring-data-jpa-injection-fails-beancreationexception-could-not-autowire-fi by cc-by-sa and MIT license