2010-01-12 1 views
0

Spring 컨테이너 외부에서 Spring Framework의 @Transactional 지원을 사용할 수있다. 참조 문서에서 AspectJ aspect에 관한 장이다. 내 wicket 응용 프로그램에서 사용하려고하지만 긍정적 인 결과가 없습니다.Wicket with Spring 선언적 트랜잭션

응용 프로그램의 context.xml : @Configurable 주석이 내 폼 클래스에서

<tx:annotation-driven transaction-manager="transactionManager" mode="aspectj" /> 
<context:annotation-config /> 
<context:component-scan base-package="com.wicket.app"/> 
<context:spring-configured /> 

<bean id="annotationTransactionAspect" factory-method="aspectOf" 
     class="org.springframework.transaction.aspectj.AnnotationTransactionAspect"> 
    <property name="transactionManager" ref="transactionManager"></property> 
</bean> 

, 내가 가진 :

@Transactional 
public void process(IFormSubmittingComponent submittingComponent) { 
    super.process(submittingComponent); 
    getDao().getEntityManager().flush(); 
} 

스택 추적 :

org.apache.openjpa.persistence.TransactionRequiredException: Can only perform operation while a transaction is active. 

답변

4

을 너 이 AspectJ load-time-weaving을 사용하여이 작업을 수행 할 수 있지만 이는 간단한 문제에 대한 매우 복잡한 해결책입니다.

선언적 트랜잭션이 필요하다면 wicket 구성 요소의 트랜잭션 로직을 Spring bean으로 옮기고 wicket 객체에서 Spring bean을 호출하는 것이 좋습니다. Spring 빈은 트랜잭션 어노테이션을 가지며 스프링 컨테이너에 의해 올바르게 프록시 될 것이다.

+0

예, 내 잘못입니다. 이 간단한 솔루션이 더 좋습니다. 과장 할 필요가 없습니다. – nablik

0

위켓에 대한 경험이 없습니다. 하지만 당신의 '폼 클래스'(@Transactional 주석이 달린 메소드를 포함하는)가 스프링 관리 코드입니까? 누가 클래스의 인스턴스를 생성합니까?

그렇지 않은 경우 Spring은 @Transactional 지원을 제공하지 않습니다 (@Autowired 작업 등은 아님).

+0

@Transactional은 Spring 컨테이너 외부에서 사용할 수 있습니다 (예 : 엔티티 클래스 documentation). 그러나 나는 잘못된 것을했고 그것은 효과가 없습니다. – nablik

+0

http://static.springsource.org/spring/docs/2.0.x/reference/transaction.html#transaction-declarative-aspectj를 참조하고 있습니까? 그렇다면 네 - 맞아요, 비 스프링 관리 코드에 대한'@ Transactional' 지원을 추가 할 것입니다,하지만이 클래스들 모두는 여전히 스프링에 의해 어떤 종류의 처리를 거쳐야합니다 (그들은'spring-aspects.jar'라고 부릅니다). –

+0

aspectj 처리를 추가하려고하는데 작동하지 않습니다. 어떤 sugestions 이유? – nablik