struts2的Action中使用spring的@Transactional注解事务出错

Posted 众妙之门

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struts2的Action中使用spring的@Transactional注解事务出错相关的知识,希望对你有一定的参考价值。

1.在Struts2使用的是spring管理对象。

使用spring的注解式事务配置, 在action的方法中直接使用事务遇到的问题. 

public class testAction extends BaseAction{  
   @Transactional  
   public String test1() throws Exception {  
     dosomething();  
   }  
  
   public String test2() throws Exception {  
     dosomething();  
   }  
}  

只要在上例testAction两个方法任意一个加上@Transactional注解, 用test_test1.do访问时就会报错

java.lang.NoSuchMethodException: $Proxy9.test1(). 

访问未配置@Transactional的方法也一样, 例如test_test2.do也会一样报错

java.lang.NoSuchMethodException: $Proxy9.test2().  

原因:

将@Transactional 注释放置于Action class,由于Spring是采用AOP来实现Transaction的控制的。而Spring AOP有两种方式,JDK代理和CGLIB。默认方式是JDK代理,这种方式要求被代理的目标类的public method 必须有接口。但是对于Action 的实现类,一般不会为它再去创建一个Interface。如果采用CGLib的方式, 则必须将

<aop:aspectj-autoproxy proxy-target-class="true"/>或者<tx:annotation-driven transaction-manager="transactionManager"  proxy-target-class="true"/>

放于spring的配置文件中。

这样就可以action了,但是我在action注入sercice接口时,发现没有注入成功,是null的对象,后面在去找下原因。

一般我们也不把@Transactional放到Action或者Controller上面,都是放到service上面的,这样也不会出现这个问题

以上是关于struts2的Action中使用spring的@Transactional注解事务出错的主要内容,如果未能解决你的问题,请参考以下文章

struts2学习笔记之十四:使用注解配置Action(不是和spring集成使用)

struts2中的Action接口和Actionsupport接口各有啥作用

struts2 与spring整合

Spring和Struts2整合

spring与struts2整合出现错误HTTP Status 500 - Unable to instantiate Action

spring怎么管理有多个方法的action,求指教