【问题标题】:@Transactional in super classes not weaved when using load time weaving使用加载时编织时未编织超类中的@Transactional
【发布时间】:2015-09-18 19:08:06
【问题描述】:

我正在处理的项目与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@Transactional 注释不再编织。每次服务类在PersonDao 对象上调用persist 方法时,都不会启动任何事务。

值得注意的:

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

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

【问题讨论】:

  • IIRC 你需要为 LTW 指定包,也许你缺少一个?
  • 整个项目包含在<include> 元素的within 属性中,在aop.xml 文件中。
  • 你试过blog.timmattison.com/archives/2012/04/19/…的技巧和窍门吗?
  • 首先,@Transactional 只应该在 JPABase 子类中。其次,尝试将 spring-instrument-tomcat.jar 放在 Apache Tomcat 目录的 /lib 路径中,并在 /conf 上配置你的 context.xml,使用类加载器到 weaver (org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader)
  • @ksokol 我的理解是,他们回到编译时间编织而不是加载时间(所以没有解决方案)......

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


【解决方案1】:

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

【讨论】:

  • 构造函数的可见性并不重要。而公共方法仅适用于基于代理的 AOP,不适用于 Weaving。
【解决方案2】:

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),就可以了。

这里是必需的依赖 jar:catalina.jar,tomcat-coyote.jar,tomcat-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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-27
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多