titledborder poner example borde java spring aspectj load-time-weaving compile-time-weaving

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

  1. modificar context.xml :