如何配置 spring 启动应用程序以使用 aspectj 事务?
How to configure spring boot application to use aspectj transactions?
我想在 spring-boot 应用程序中使用由方面完成的事务,但到目前为止,我主要找到了有关更多 "ordinary" 设置的帮助...
到目前为止我设置了什么?
我在主 class:
上有这些注释
@SpringBootApplication
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ)
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
这在我的属性中:
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
我开始使用 java 代理 spring-instrument 和 aspectj-weaver 进行应用,我可以在堆栈跟踪中看到我使用过 @Transactional
的方面,所以至少这是工作。
此外,真正奇怪的是,只有在我添加第二个实体后问题才开始出现 - 第一个实体没有问题,但现在我遇到了这个错误:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
据我所知,当 invokeWithinTransaction
在 TransactionAspectSupport
上 运行 时,beanFactory 是 null
- 但它是在创建 bean 期间设置的(以及我从当 beanFactory
为 null
TransactionAspectSupport
时在调试中看到 TransactionAspectSupport
不会启动事务,因为它无法获得 TransactionManager
)。我想 TransactionAspectSupport
的非 bean 实例在某个时候被创建,这可能是我的问题的原因(但是如何以及为什么?)?
更新:
据我所知,@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>
好的。我是个白痴,没看autoimport是干什么的
我在一个地方使用了 org.springframework.transaction.annotation.Transactional
,在另一个地方使用了 javax.transaction.Transactional
。
将所有内容更改为 spring 后提供 @Transactional 它开始工作。
我想在 spring-boot 应用程序中使用由方面完成的事务,但到目前为止,我主要找到了有关更多 "ordinary" 设置的帮助...
到目前为止我设置了什么?
我在主 class:
上有这些注释@SpringBootApplication
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ)
@EnableLoadTimeWeaving(aspectjWeaving=AspectJWeaving.ENABLED)
这在我的属性中:
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate4.SpringSessionContext
我开始使用 java 代理 spring-instrument 和 aspectj-weaver 进行应用,我可以在堆栈跟踪中看到我使用过 @Transactional
的方面,所以至少这是工作。
此外,真正奇怪的是,只有在我添加第二个实体后问题才开始出现 - 第一个实体没有问题,但现在我遇到了这个错误:
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
据我所知,当 invokeWithinTransaction
在 TransactionAspectSupport
上 运行 时,beanFactory 是 null
- 但它是在创建 bean 期间设置的(以及我从当 beanFactory
为 null
TransactionAspectSupport
时在调试中看到 TransactionAspectSupport
不会启动事务,因为它无法获得 TransactionManager
)。我想 TransactionAspectSupport
的非 bean 实例在某个时候被创建,这可能是我的问题的原因(但是如何以及为什么?)?
更新:
据我所知,@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>
好的。我是个白痴,没看autoimport是干什么的
我在一个地方使用了 org.springframework.transaction.annotation.Transactional
,在另一个地方使用了 javax.transaction.Transactional
。
将所有内容更改为 spring 后提供 @Transactional 它开始工作。