2012-07-31 5 views
0

기존 Spring 3 JPA 2 Hibernate 웹 어플리케이션을 Spring Data JPA로 마이그레이션하려고합니다. 그러나 단지스프링 데이터 JPA는 저장소가 아닌 클래스에 CGLib 프록시를 강제 실행합니다.

<jpa:repositories 
    base-package="myapp.persistence.spring" 
    entity-manager-factory-ref="entityManagerFactory" 
    transaction-manager-ref="transactionManager" /> 

봄을 다음과 같이 Maven 프로젝트에 대한 최신 스프링 데이터 JPA를 추가하고 봄 데이터를 구성하여 불평을 시작 : 봄 데이터 동안 패키지 myapp.persistence.spring을 검사하도록 설정되어 있는지

2012-07-31 16:54:23,153 ERROR [ContextLoader  ] - [Context initialization failed                  ] - [remoteAddress=, remoteHost=, thread=pool-2-thread-1] org.springframework.web.context.ContextLoader 
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'companyRepository' defined in file [C:\Development\ApplicationServer\apache-tomcat-7.0.27\webapps\myapp\WEB-INF\classes\myapp\persistence\CompanyRepository.class]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces. 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469) ~[spring-context-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.web.context.ContextLoader.createWebApplicationContext(ContextLoader.java:282) ~[spring-web-3.0.7.RELEASE.jar:3.0.7.RELEASE] 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:204) ~[spring-web-3.0.7.RELEASE.jar:3.0.7.RELEASE] 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:47) [spring-web-3.0.7.RELEASE.jar:3.0.7.RELEASE] 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779) [catalina.jar:7.0.27] 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273) [catalina.jar:7.0.27] 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:7.0.27] 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1566) [catalina.jar:7.0.27] 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1556) [catalina.jar:7.0.27] 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) [na:1.6.0_24] 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) [na:1.6.0_24] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [na:1.6.0_24] 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [na:1.6.0_24] 
    at java.lang.Thread.run(Thread.java:662) [na:1.6.0_24] 
Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces. 
    at org.springframework.aop.framework.DefaultAopProxyFactory.createAopProxy(DefaultAopProxyFactory.java:67) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.aop.framework.ProxyCreatorSupport.createAopProxy(ProxyCreatorSupport.java:104) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:112) ~[spring-aop-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor.postProcessAfterInitialization(PersistenceExceptionTranslationPostProcessor.java:133) ~[spring-tx-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1461) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) ~[spring-beans-3.1.2.RELEASE.jar:3.1.2.RELEASE] 
    ... 21 common frames omitted 

공지 사항을 위의 오류는 패키지 myapp.persistence의 클래스를 참조합니다. CGlib을 프로젝트에 추가하면 Spring Data를 포함한 모든 것이 잘 동작합니다. 하지만 무슨 일이야? 나는 신인이며 매우 당황 스럽다. 나는 스프링 데이터가 프록시 마술을 어떻게하는지 알 수 없었다. 적어도 공식적인 예제에는 CGlib이 전혀 포함되어 있지 않습니다. 추가 정보 :

CompanyRepository는 EntityManager를 사용하여 간단한 자기 - JPA-DAO이다 :

@Repository 
@Transactional(propagation = Propagation.MANDATORY) 
public class CompanyRepository extends AbstractRepository<Company, Long> { 
    … 
} 

거래는 @Transactional를 통해 사용 가능하고 AspectJ의 시간 직물을 컴파일합니다. 컨텍스트 구성 조각 : <jpa:repositories /> 사용하여 reference documentation에서 설명한 바와 같이

<tx:annotation-driven proxy-target-class="true" mode="aspectj"/> 
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

톰캣 7.0.27

답변

2

배포는 @Repository로 주석 봄 콩에 대한 지속성 예외 번역을 활성화합니다. JavaDoc@Repository 인 시점에서 주석의 주된 목적은 예외 변환으로, 주석이 첨부 된 구성 요소에 적용됩니다. 클래스가 JDK 프록시를 사용할 수있는 인터페이스를 구현하는 경우. 귀하의 경우와 같이 CGLib가 프록시를 생성해야합니다. 그 자세한 내용은 Spring reference documentation을 참조하십시오.

  1. @Repository 주석 각 구성 요소에 대한 인터페이스를 소개 : CGLIB없이 <jpa:repositories />를 사용하려면

    당신은 기본적으로 시나리오의 두 가지 선택이있다. 이것은 아마도 당신이 원하는대로 지속성 예외 번역을 적용 할 것입니다.

  2. 우선 @Repository을 사용하지 말고 @Component은 이러한 구성 요소에 대해 예외 변환을 본질적으로 해제합니다.
관련 문제