Spring/@Transactional with AspectJ 完全被忽略 [英] Spring / @Transactional with AspectJ is totally ignored

查看:30
本文介绍了Spring/@Transactional with AspectJ 完全被忽略的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用 Spring-Data Neo4j 2.2.0-RELEASE.(我的以下问题适用于任何其他类型的实体映射,为什么不是 JPA)

I use Spring-Data Neo4j 2.2.0-RELEASE. (my following issue would be applicable to any other kind of entity mapping, why not JPA)

在我的项目中,我有一个用 @Transactional Spring 的注释注释的公共方法,因为我想更新/保存其中的实体:

In my project, I have a public method annotated with @Transactional Spring's annotation, since I want to update/save an entity inside it:

public class MeetingServices {

    private UserRepository userRepository;

    private MeetingRepository meetingRepository;

    public void setUserRepository(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public void setMeetingRepository(MeetingRepository meetingRepository) {
        this.meetingRepository = meetingRepository;
    }

    @Transactional("neo4jTransactionManager")
    public void save(Meeting meeting) {
        User creator = userRepository.getUserByEmail("test@test.com");
        creator.participateIn(meeting); // this line leads to a NotInTransactionException since it signals that no transaction context is associated.
        meeting.setCreator(creator);
    }

我的 application-context.xml 如下:

My application-context.xml is the following:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/neo4j
       http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <bean id="graphDatabaseService" class="org.neo4j.kernel.EmbeddedGraphDatabase">
        <constructor-arg value="target/neo4jgraph" />
    </bean>

    <neo4j:config graphDatabaseService="graphDatabaseService" />

    <bean id="meetingServices" class="services.MeetingServices">
        <property name="userRepository"><ref bean="userRepository"/></property>
        <property name="meetingRepository"><ref bean="meetingRepository"/></property>
    </bean>

    <bean id="userServices" class="services.UserServices">
        <property name="userRepository"><ref bean="userRepository"/></property>
    </bean>

    <bean id="neo4jTransactionManager"
        class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager">
            <bean class="org.neo4j.kernel.impl.transaction.SpringTransactionManager">
                <constructor-arg ref="graphDatabaseService" />
            </bean>
        </property>
        <property name="userTransaction">
            <bean class="org.neo4j.kernel.impl.transaction.UserTransactionImpl">
                <constructor-arg ref="graphDatabaseService" />
            </bean>
        </property>
    </bean>

    <tx:annotation-driven mode="aspectj"
        transaction-manager="neo4jTransactionManager" />

    <!-- auto-generated repositories for Neo4j storage -->
    <neo4j:repositories base-package="repositories"/> 

    <context:spring-configured/>

    <context:annotation-config/>

</beans>

正如我们在此配置中看到的,aspectJ 用于事务.

As we see in this configuration, aspectJ is used for transactions.

因此,我尝试通过更改我的 application-context.xml 以使用 proxy 功能而不是 aspectJ 功能来测试另一种方法:

So, I tried to test another way of doing by changing my application-context.xml to use the proxy feature instead of aspectJ feature:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/neo4j
       http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <bean id="graphDatabaseService" class="org.neo4j.kernel.EmbeddedGraphDatabase">
        <constructor-arg value="target/neo4jgraph" />
    </bean>

    <neo4j:config graphDatabaseService="graphDatabaseService" />

    <bean id="meetingServices" class="services.MeetingServices">
        <property name="userRepository"><ref bean="userRepository"/></property>
        <property name="meetingRepository"><ref bean="meetingRepository"/></property>
    </bean>

    <bean id="userServices" class="services.UserServices">
        <property name="userRepository"><ref bean="userRepository"/></property>
    </bean>

    <tx:annotation-driven mode="proxy" />


    <neo4j:repositories base-package="repositories"/>

    <context:spring-configured/>

    <context:annotation-config/>

</beans>

此配置运行良好,因为 @Transactional(其 neo4jTransactionManager 参数当然已被删除)注释现在已用于我的服务方法.

This configuration works pretty well since @Transactional (whose neo4jTransactionManager parameter was of course removed) annotation is now taken in account for my service's method.

我的问题是,(无论我的项目是否可以使用简单的 proxy 方法):

My question is, (no matter whether my project would work with simple proxy method):

我在第一个 Spring 配置中遗漏或错误配置了什么导致 aspectJ 事务功能失败?

What did I miss or misconfigure in my first Spring's configuration that makes aspectJ transaction features failed?

我目前正在使用 Spring 提高我的技术技能,并阅读了一些关于 aspectJ 的加载时编织"的文章.这可能与我的问题有关吗?

I'm currently improving my technical skills with Spring, and read few articles about "Load-time weaving" for aspectJ. Might this be linked to my issue?

推荐答案

尝试添加 以启用加载时间编织并添加弹簧方面.jar 到类路径.

Try adding <context:load-time-weaver/> to enable load time weaving and add the spring-aspects.jar to the classpath.

参见 http://static.springsource.org/spring/docs/current/spring-framework-reference/html/aop.html#aop-aj-ltw-spring 了解更多信息

编辑

对于通用 java 应用程序,即不在 web 或应用程序容器中运行,您需要通过 javaagent 选项启用 java 检测:

For generic java applications, ie not running in a web or application container, you need to enable the java instrumentatioin via a javaagent option:

java -javaagent:path/to/spring-instrument.jar your.Main

如果你想编织你自己的方面,你需要提供一个带有方面声明的 META-INF/aop.xml 文件.(仅对于 spring 方面不需要,它已经在 spring-aspect.jar 上提供).

If you want to weaving your own aspects, you need to provide a META-INF/aop.xml file with aspect declarations. (Not requiered for spring only aspects, it's already provided on spring-aspect.jar).

最后,您可以使用编译时编织代替,使用 maven aspectj 插件,例如:

Finally you can use compile time weaving instead, using the maven aspectj plugin, for example:

<plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>aspectj-maven-plugin</artifactId>
            <configuration>
                <complianceLevel>1.6</complianceLevel>
                <aspectLibraries>
                    <aspectLibrary>
                        <groupId>org.springframework</groupId>
                        <artifactId>spring-aspects</artifactId>
                    </aspectLibrary>
                </aspectLibraries>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

这篇关于Spring/@Transactional with AspectJ 完全被忽略的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆