如何配置 Spring Boot 应用程序以使用 aspectj 事务?

Posted

技术标签:

【中文标题】如何配置 Spring Boot 应用程序以使用 aspectj 事务?【英文标题】:How to configure spring boot application to use aspectj transactions? 【发布时间】:2016-03-21 19:47:24 【问题描述】:

我想在 spring-boot 应用程序中使用方面完成的事务,但到目前为止,我主要找到了更多“普通”设置的帮助......

到目前为止我已经成功设置了什么?

我在主类上有这些注释:

@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

invokeWithinTransactionTransactionAspectSupport 上运行时,我注意到beanFactory 是null - 但它是在创建bean 期间设置的(从我在调试中看到的beanFactory 是@987654329 时) @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>

【问题讨论】:

你不需要设置当前会话上下文,因为春天已经完成了。您还使用普通休眠还是JPA?您能否也发布您是如何启动该应用程序的。 嗯...我通过简单地运行主类来启动它,该主类在主方法和相关注释中具有`SpringApplication.run(Application.class, args);`。没什么特别的,因为我试图将我的修改保持在所需的最低限度。编辑:另外,我使用两个 -javaagent 运行它,设置如问题所述。 【参考方案1】:

好的。我是个白痴,没有看自动导入在做什么。

我在一个地方使用了org.springframework.transaction.annotation.Transactional,在另一个地方使用了javax.transaction.Transactional

在将所有内容更改为 spring 提供 @Transactional 后,它开始工作。

【讨论】:

以上是关于如何配置 Spring Boot 应用程序以使用 aspectj 事务?的主要内容,如果未能解决你的问题,请参考以下文章

如何配置spring-boot千分尺以推入elasticsearch?

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]

如何使用 Spring Boot 以编程方式确定当前的活动配置文件 [重复]

如何配置 Spring Boot 应用程序以在 MySQL 上使用 SSL/TLS?

启动时如何配置 Spring Boot 应用程序以在特定数据库上运行