Spring @Controller和Transactionmanager

时间:2010-06-24 16:02:58

标签: java spring transactions spring-mvc

我有一个基本的Spring Controller

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: ...,因此使用了事务配置。

但是映射不再起作用了。有任何想法吗?

我正在使用Spring 3.0.2.RELEASE

1 个答案:

答案 0 :(得分:4)

使用dynamic proxy应用事务方面,它阻止Spring MVC访问目标类上的@RequestMapping注释。您可以使用<aop:config proxy-target-class="true">作为解决方法。

Spring团队表示,出于效率原因,他们不会解决此问题(请参阅comment on SPR-5084