@Transactional在使用加载时间编织时未编织的超类中

我正在从事的项目具有与下面的一个类似的结构:DAOs

/** 
* Base DAO class
*/
@Transactional    
public class JPABase {

  @PersistenceContext
  private EntityManager entityManager;

  public void persist(Object entity) {
    entityManager.persist(entity);
  }
 //some more methods in here
}

/** 
* Generic DAO class implementation
*/
@Transactional 
public abstract class GenericDao extends JpaBase {
   //some methods in here
}

/** 
* Specialized DAO class
*/
@Repository
@Transactional
public class PersonDao extends GenericDao {
  //some methods in here
}

到目前为止,该项目使用编译时编织,但配置已更改为与 .<context:load-time-weaver/>-javaagent:/opt/tomcat7-1/lib/spring-instrument.jar

由于已应用此更改,因此 不再编织 的注释。每次服务类调用对象上的方法时,都不会启动任何事务。JpaBaseGenericDao@TransactionalpersistPersonDao

值得 注意:

  • 这在过去使用编译时编织时曾经工作过。
  • 中定义的所有方法都已正确编织,但继承的方法(例如)未编织。PersonDaopersist(Object entity)

编译时编织和加载时间编织应该做同样的事情,只是在不同的时刻。为什么编织行为发生了变化?


答案 1

Tomcat 的默认值是 ,但你需要 'TomcatInstrumentableClassLoader。classlLoaderWebappClassLoader

有两种解决方案

  1. 修改 WebappLoader.class

更改 WebappLoader.java

private String loaderClass =  "org.apache.catalina.loader.WebappClassLoader";

取代:

private String loaderClass = "org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader";  

编译它并替换类文件(catalina.jar),然后它就可以工作了。

以下是必需的依赖项 jar:,,,catalina.jartomcat-coyote.jartomcat-util.jar(/bin)tomcat-juli.jar

  1. 修改上下文.xml:

<?xml version="1.0" encoding="UTF-8"?>  
<Context>  
    <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>  
</Context>


答案 2

您可能缺少这些类中的公共构造函数链接,@Transactional仅当类具有公共构造函数和公共方法时才起作用。


推荐