Я хотел бы использовать транзакции, выполненные по аспектам в применении пружинных загрузок, но до сих пор я в основном нашел помощь для более «обычных» установок ...Как настроить приложение загрузки весны для использования транзакций aspectj?
Что мне удалось настроить до сих пор?
Я получил эти аннотации на основном классе:
@SpringBootApplication
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ)
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
И это в моих свойствах:
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
Я запускаемый с Java Agents пружинного инструментом и AspectJ-ткачом и Я могу видеть аспекты в stacktrace, где я использовал @Transactional
, так что, по крайней мере, это работает.
Кроме того, что действительно странно, проблема началась только после того, как я добавил второй объект - первый один работал без проблем, но теперь у меня эта ошибка:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
Из того, что я заметил BeanFactory является null
когда invokeWithinTransaction
в настоящее время работает на TransactionAspectSupport
- но это время устанавливается во время создания боба (и от того, что я видел в отладке, когда beanFactory
является null
TransactionAspectSupport
не будет начать транзакцию, поскольку он не в состоянии получить TransactionManager
). Я предполагаю, что в какой-то момент создается не-bean-экземпляр TransactionAspectSupport
, и это может быть причиной моей проблемы (но тогда как и почему?)?
Update:
Из того, что я заметил @Transactional
обрабатывается AnnotationTransactionAspect
в одном случае, но JtaAnnotationTransactionAspect
в другой.
Любые идеи, что мне не хватает? Возможно, какое-то волшебное свойство я должен установить?
О, и вот моя зависимость, если это важно:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-instrument</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.7</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
</dependencies>
Вам не нужно устанавливать текущий контекст сеанса, как это уже сделано весной. Также вы используете простой спящий режим или JPA? Можете ли вы также опубликовать, как вы запускаете приложение. –
Ну ... Я начинаю с простого запуска основного класса, который имеет SpringApplication.run (Application.class, args); 'в основном методе и аннотации, о которых идет речь. Ничего особенного, так как я стараюсь, чтобы мои модификации были минимальными. EDIT: также, я запускаю его с двумя javaagent, заданными, как описано в вопросе. – korda