@Transactional в суперклассах не сплетался при использовании ткачества времени загрузки

В проекте, над которым я работаю, структура 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 и @Transactional @Transactional больше не переплетаются. Каждый раз, когда класс обслуживания вызывает метод persist для объекта PersonDao, транзакция не запускается.

Примечательно:

  • раньше это работало, когда использовалось ткачество времени компиляции.
  • все методы, которые определены в PersonDao, сплетены правильно, но унаследованные (например, persist(Object entity)) НЕ переплетены.

Предполагается, что переплетение времени компиляции и переплетение времени загрузки делают одно и то же, только в разные моменты времени. Почему изменилось поведение ткачества?


person Anca N    schedule 01.07.2015    source источник
comment
IIRC, вам нужно указать пакеты для LTW, может быть, вам не хватает одного?   -  person Marvin    schedule 01.07.2015
comment
Весь проект включен в атрибут within элемента <include> в файле aop.xml.   -  person Anca N    schedule 01.07.2015
comment
Вы пробовали советы и рекомендации от blog.timmattison.com/archives/2012/04/19/?   -  person Andrei Mărcuţ    schedule 02.07.2015
comment
Во-первых, только @Transactional должен быть в подклассе JPABase. Кроме того, попробуйте поместить spring-instrument-tomcat.jar в путь / lib в вашем каталоге Apache Tomcat и настройте свой context.xml в / conf с загрузчиком классов на weaver (org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader)   -  person Dani    schedule 10.07.2015
comment
Наконец, мы перешли на компилирование времени. Теперь все работает нормально :)   -  person Anca N    schedule 02.10.2015
comment
Вы включили ткачество во время загрузки для AspectJ? Читая документацию, кажется, что вам нужно либо иметь META-INF/aop.xml файл на пути к классам (на войне, а не банку?), Либо активировать его другим способом с помощью кода. Для включения ткачество во время загрузки для получения дополнительной информации.   -  person Marco    schedule 21.10.2015
comment
@ anca-n Не могли бы вы опубликовать свое решение в качестве ответа?   -  person ksokol    schedule 10.11.2015
comment
@ksokol, насколько я понимаю, они вернулись к ткачеству времени компиляции вместо времени загрузки (так что решения нет) ...   -  person Betlista    schedule 14.01.2016
comment
Действительно, мы вернулись к компилированию времени, и теперь все работает нормально.   -  person Anca N    schedule 13.04.2016
comment
Возможно, сканирование JAR для @Servlet и других веб-аннотаций загрузит класс без переплетения. Попробуйте отключить сканирование для своей библиотеки. Также проверьте tomcat.apache.org/tomcat-7.0-doc/ config /   -  person Ales Dolecek    schedule 08.06.2017


Ответы (2)


Tomcat по умолчанию classlLoader - WebappClassLoader, но вам нужен 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-файлы зависимостей: _5 _, _ 6 _, _ 7 _, _ 8_

  1. Измените context.xml:

<?xml version="1.0" encoding="UTF-8"?> <Context> <Loader loaderClass="org.springframework.instrument.classloading.tomcat.TomcatInstrumentableClassLoader"/> </Context>

person Denny.Zhang    schedule 29.10.2018

Вероятно, вам не хватает цепочки общедоступных конструкторов внутри этих классов, @Transactional будет работать, только если классы имеют общедоступные конструкторы и общедоступные методы.

person ajay tomar    schedule 04.04.2018
comment
видимость конструкторов не имеет значения. И общедоступные методы применяются только к AOP на основе прокси, но не при использовании Weaving. - person M. Deinum; 01.10.2018