2010-06-24 3 views
1

나는 봄 @Controller와 TransactionManager에

package org.foo; 

@Controller 
public class HelloWorldController implements IHelloWorldController 
{ 
    @RequestMapping(value = "/b/c/", method = RequestMethod.GET) 
    public void doCriticalStuff(HttpServletRequest request, HttpServletResponse response){ 
     //... 
    } 
} 

잘 작동 curl -X GET http://myIP:myPort/b/c/ 를 통해 테스트 기본적인 봄 컨트롤러를 보내고 있습니다.

내가

<bean id="txManager" 
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<tx:advice id="txAdvice" transaction-manager="txManager"> 
    <tx:attributes> 
     <tx:method name="*" /> 
    </tx:attributes> 
</tx:advice> 
<aop:config> 
    <aop:pointcut id="helloWorldPC" 
     expression="execution(* org.foo.IHelloWorldController.*(..)) &amp;&amp; !execution(* java.lang.Object.*(..))" /> 
<aop:advisor advice-ref="txAdvice" pointcut-ref="helloWorldPC" /> 
</aop:config> 

매핑을 통해 트랜잭션 관리를 구성하고있어 경우는 더 이상 작동하지 않습니다. 클라이언트 측에서 404 에러가 발생하고 서버에서 메소드가 입력되지 않습니다. doCriticalStuff에서 중단 점이있는 JUnit 테스트 수행 AopUtils.invokeJoinpointUsingReflection(Object, Method, Object[]) line: ...을 볼 수 있으므로 트랜잭션 구성이 사용됩니다.

그러나 매핑이 더 이상 작동하지 않습니다. 어떤 아이디어?

I 스프링 3.0.2.RELEASE

답변

4

트랜잭션 양태 dynamic proxy을 사용인가 사용하고, 그것을 목표 클래스에 @RequestMapping 주석 액세스 스프링 MVC를 방지한다. 해결 방법으로 <aop:config proxy-target-class="true">을 사용할 수 있습니다. <: 설정 프록시 대상 클래스 = "true"로 AOP> 대신 및 포함 CGLIB

봄 팀은 효율성을 이유로이 동작 (comment on SPR-5084 참조)

+0

좋아, 내가 추가 썼다을 수정하지 않을 것이라고 말했다 버전 2.2 이제 "라인 번호 속성을 누락으로 인해 중단 점을 설치할 수 없습니다"시도 http://solveme.wordpress.com/2008/08/27/unable-to-install-breakpoint-due-to-missing-line- 숫자 속성/지금까지 도움이되지 않습니다. m2Eclipse 버전 0.10.0.20100209-0800을 사용하고 있는데 문제가 있습니까? –

+0

떨어져 나가 다음 호출 스택 MethodProxy.invoke 참조 중단 메시지로부터 Cglib2AopProxy $ CglibMethodInvocation.invokeJoinpoint (오브젝트 [] 객체)() \t Cglib2AopProxy $ CglibMethodInvocation (ReflectiveMethodInvocation) .proceed() \t TransactionInterceptor.invoke (MethodInvocation을) Cglib2AopProxy $ CglibMethodInvocation (ReflectiveMethodInvocation) .proceed() \t ExposeInvocationInterceptor.invoke (위한 MethodInvocation) Cglib2AopProxy $ CglibMethodInvocation (ReflectiveMethodInvocation) .proceed() Cglib2AopProxy $ DynamicAdvisedInterceptor.intercept (개체 방법, [] MethodProxy 개체) 프록시 AOP 프록시가 사용됩니다. –