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

时间:2015-07-01 14:39:44

标签: java spring aspectj load-time-weaving compile-time-weaving

我正在研究的项目与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的{​​{1}}注释。每次服务类调用@Transactional对象上的persist方法时,都不会启动任何事务。

值得注意的是:

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

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

2 个答案:

答案 0 :(得分:0)

Tomcat的默认classlLoaderWebappClassLoader,但是您需要`TomcatInstrumentableClassLoader。

有两种解决方案

  
      
  1. 修改WebappLoader.class
  2.   

更改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. 修改context.xml:
  2.   

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

答案 1 :(得分:-1)

你可能错过了在这些类中链接的公共构造函数,@ Transaction仅在类具有公共构造函数和公共方法时才有效。