我使用Spring-Data Neo4j 2.2.0-RELEASE。(我的以下问题将适用于任何其他类型的实体映射,为什么不适用于JPA)
在我的项目中,我有一个用@Transactional
Spring注释注释的公共方法,因为我想在其中更新/保存一个实体:
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是以下内容:
<?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用于事务。
因此,我尝试通过更改application-context.xml以使用proxy
功能而不是aspectJ
功能来测试另一种方式:
<?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
当然已删除了其参数)注释已考虑到我的服务的方法。
我的问题是(无论我的项目是否可以使用简单的proxy
方法工作):
我在第一个Spring的配置中错过了什么或配置错误,从而使AspectJ事务功能失败了?
我目前正在提高Spring的技术技能,并阅读了有关AspectJ的几篇有关“加载时编织”的文章。这可能与我的问题有关吗?
尝试添加 <context:load-time-weaver/>
以启用加载时编织,然后将spring-aspects.jar添加到类路径。
有关更多信息,请参见http://static.springsource.org/spring/docs/current/spring-
framework-reference/html/aop.html#aop-aj-ltw-
spring
编辑
对于一般的Java应用程序,即不在Web或应用程序容器中运行的应用程序,您需要通过javaagent选项启用Java工具:
java -javaagent:path/to/spring-instrument.jar your.Main
如果要编织自己的方面,则需要提供带有方面声明的META-INF / aop.xml文件。(仅在spring方面不是必需的,已经在spring-
aspect.jar中提供了)。
最后,您可以使用Maven Aspectj插件代替编译时编织,例如:
<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>
问题内容: 我的@Transactionnal注释似乎被忽略了。我对Spring容器的初始化没有任何错误。看来我的方法尚未被Spring TX框架代理。在执行服务的方法期间,JDBCTemplate会引发预期的RuntimeException。问题在于JDBC连接没有回滚,并且更改保持不变。stacktrace没有显示应该包装我的服务方法的代理的任何迹象。 编辑:添加了控制器的代码 编辑2:添加了
问题内容: 这与Spring 在服务层上使用 注释有关。 我经历了很多关于此的堆栈溢出问题,但是仍然对是否应该避免使用感到困惑。 如果有人帮助我找出以下查询的答案,那将是很大的帮助。 在具有复杂模式的应用程序中使用是不好的做法。 使用此过滤器可能会导致问题 如果我们正在使用,是否意味着不需要? 下面是我的Spring配置文件 问题答案: 是一个servlet过滤器,而不仅仅是打开一个hiberna
我想用aspectJ应用注释。(使用Springboot 1.5.1,Mybatis 2.1.1) 因此,我制作了自定义注释和AspectJ…并应用它。 (此代码很简单,有问题) 如果切入点表达式应用“执行”,则这段代码在存储库(DAO)中运行良好..此外,如果切入点表达式应用了' @annotation ',则该代码也适用于其他组件(服务..控制器) 但是,为什么我不能用AspectJ在Repo
我正在尝试使用LTW在Weblogic上运行AspectJ。我的切入点是针对公共建构者和方法,建议是针对之前、之后和之后。当我访问一个简单的“Hello World”jsp时,出现以下错误: 这是我的aop。xml文件: 这是我的方面文件: 这个方面被编译(使用普通的javac编译器)到foo中。罐子 我通过添加以下内容来运行Weblogic: 我认为这很可能是类路径/类加载器问题,因为Aspec
现在编译器很高兴了,所以我可以添加注释: 程序编译,运行,但是注释被完全忽略。
这里需要改的只有配置文件xml换成java文件: 测试类: 文件的位置为: