38

我正在从事的项目与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/>with -javaagent:/opt/tomcat7-1/lib/spring-instrument.jar

由于已应用此更改,因此不再编织JpaBase' 和GenericDao'注释。@Transactional每次服务类调用对象的persist方法时PersonDao,都不会启动事务。

值得注意的是:

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

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

4

2 回答 2

1

Tomcat 默认classlLoaderWebappClassLoader,但你需要 `TomcatInstrumentableClassLoader.

有两种解决方案

  1. 修改 WebappLoader.class

更改 WebappLoader.java

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

替换:</p>

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

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

这里是必需的依赖 jars: 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>

于 2018-10-29T10:37:53.710 回答
-1

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

于 2018-04-04T09:54:20.003 回答