我对方法有一个方面,由@Around注释,其中有以下几行:
@Around("@annotation(CustomAnnotation)")
public void handle(ProceedingJoinPoint joinPoint) {
MethodSignature ms = (MethodSignature) joinPoint.getSignature();
CustomAnnotation m = ms.getMethod().getAnnotation(CustomAnnotation.class);
Processor processor = appContext.getBean(m.value());
Object argument = joinPoint.getArgs()[0];
processor.preProcess(argument);
joinPoint.proceed();
processor.postProcess(argument);
}
被Aspect中断的方法:
@CustomAnnotation(value = "CreateProcessor")
public void create(User user) {
createOrUpdate(user); //in this method user in "Users" is created or updated
}
Processor.preProcess()为空。
Processor.postProcess():
@Override
public void postProcess(Object obj) {
//add obj to "Objects" table in DB
}
所有这些方法(preProcess,postProcess,proceed)都与不同的数据库表进行交互。所以我想用这3个方法调用进行一个事务,即当其中一个没有成功执行时,应该还原之前的那些更改。我怎样才能实现目标?
UPD。 我已经尝试了接下来的步骤:
在我的上下文文件中添加了以下行:
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
在我的handle()方法中添加了@Transactional注释。
要检查是否执行了回滚,我添加了异常抛出:
@Override
public void postProcess(Object obj) {
throw new RuntimeException("TEST");
//add obj to "Objects" table in DB
}
虽然抛出异常且“对象”表中没有新行,但“用户”中会出现新行。