使用加载时间编织时@Transactional在超类不织

问题描述 投票:26回答:2

我工作的项目对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

由于这种变化中得到应用,在JpaBase的和GenericDao@Transactional注释不再被编织。每次服务类调用persist对象的PersonDao方法,没有开始事务。

值得注意的是:

  • 这个曾经在过去的工作,使用编译时织的时候。
  • PersonDao中定义的所有方法都正确地编织,但遗传的那些(例如persist(Object entity))不编织。

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

java spring aspectj load-time-weaving compile-time-weaving
2个回答
0
投票

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

有两个解决方案:

  1. 修改WebappLoader.class

更改WebappLoader.java

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

更换:

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

编译并替换类文件(catalina.jar),那么它的工作原理。

这里需要依赖罐子:catalina.jartomcat-coyote.jartomcat-util.jar(/bin)tomcat-juli.jar

  1. 修改的context.xml:


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


-1
投票

你可能缺少的公共构造这些类的内部链接,@Transactional将工作仅当类具有公共构造函数和公共方法。

© www.soinside.com 2019 - 2024. All rights reserved.