poner - set border java
@Transaccional en súper clases no tejidas cuando se usa el tiempo de carga (2)
El proyecto en el que estoy trabajando tiene una estructura similar para los DAOs
a la siguiente:
/**
* Base DAO class
*/
@Transactional
public class JPABase {
@PersistenceContext
private EntityManager entityManager;
public void persist(Object entity) {
entityManager.persist(entity);
}
//some more methods in here
}
y
/**
* Generic DAO class implementation
*/
@Transactional
public abstract class GenericDao extends JpaBase {
//some methods in here
}
y
/**
* Specialized DAO class
*/
@Repository
@Transactional
public class PersonDao extends GenericDao {
//some methods in here
}
Hasta ahora, el proyecto usaba el proceso de compilación, pero la configuración ha cambiado para usar <context:load-time-weaver/>
con -javaagent:/opt/tomcat7-1/lib/spring-instrument.jar
.
Dado que este cambio se ha aplicado, las JpaBase
GenericDao
de GenericDao
y GenericDao
ya no están entrelazadas. Cada vez que una clase de servicio llama al método de persist
en un objeto PersonDao
, no se inicia ninguna transacción.
Notable:
- Esto solía funcionar en el pasado, cuando se usaba el tiempo de compilación.
- todos los métodos que se definen en el
PersonDao
se tejen correctamente, pero los heredados (por ejemplo,persist(Object entity)
) NO se tejen.
El tiempo de compilación y el tiempo de carga se supone que deben hacer lo mismo, solo en momentos diferentes en el tiempo. ¿Por qué ha cambiado el comportamiento del tejido?
Probablemente te falte el encadenamiento de constructores públicos dentro de estas clases, @Transactional funcionará solo si las clases tienen constructores públicos y métodos públicos.
Tomcat predeterminado classlLoader es WebappClassLoader, pero necesita TomcatInstrumentableClassLoader
Hay dos soluciones :
1.modificar WebappLoader.class
cambiar WebappLoader.java
private String loaderClass = "org.apache.catalina.loader.WebappClassLoader";
reemplazar:
private String loaderClass = "org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader";
compílalo y reemplaza el archivo de clase (catalina.jar), entonces funciona.
jar de dependencia: catalina.jar tomcat-coyote.jar tomcat-util.jar (/ bin) tomcat-juli.jar
modificar context.xml :