我正在研究的项目与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
的{{1}}注释。每次服务类调用@Transactional
对象上的persist
方法时,都不会启动任何事务。
值得注意的是:
PersonDao
中定义的所有方法都已正确编织,但未继承的(例如PersonDao
)未编织。编织时间编织和加载时间编织应该做同样的事情,只是在不同的时刻。为什么编织行为会发生变化?
答案 0 :(得分:0)
Tomcat的默认classlLoader
是WebappClassLoader
,但是您需要`TomcatInstrumentableClassLoader。
有两种解决方案:
- 修改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
- 修改context.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/>
</Context>
答案 1 :(得分:-1)
你可能错过了在这些类中链接的公共构造函数,@ Transaction仅在类具有公共构造函数和公共方法时才有效。