春季@Transactional方面(AOP)
2022-09-03 00:32:30
我创建了一个包含@Transactional注释的方面。我的建议正在按预期调用,但新实体 AuditRecord 永远不会保存到数据库中,看起来我的@Transactional注释不起作用。
@Aspect
@Order(100)
public class ServiceAuditTrail {
private AppService appService;
private FooRecordRepository fooRecordRepository;
@AfterReturning("execution(* *.app.services.*.*(..))")
public void logAuditTrail(JoinPoint jp){
Object[] signatureArgs = jp.getArgs();
String methodName = jp.getSignature().getName();
List<String> args = new ArrayList<String>();
for(Object arg : signatureArgs){
args.add(arg.toString());
}
createRecord(methodName, args);
}
@Transactional
private void createRecord(String methodName, List<String> args){
AuditRecord auditRecord = new AuditRecord();
auditRecord.setDate(new Date());
auditRecord.setAction(methodName);
auditRecord.setDetails(StringUtils.join(args, ";"));
auditRecord.setUser(appService.getUser());
fooRecordRepository.addAuditRecord(auditRecord);
}
public void setAppService(AppService appService) {
this.appService = appService;
}
public void setFooRecordRepository(FooRecordRepository fooRecordRepository) {
this.fooRecordRepository= fooRecordRepository;
}
}
豆的上下文如下:
<tx:annotation-driven transaction-manager="txManager.main" order="200"/>
<aop:aspectj-autoproxy />
<bean id="app.aspect.auditTrail" class="kernel.audit.ServiceAuditTrail">
<property name="appService" ref="app.service.generic" />
<property name="fooRecordRepository" ref="domain.repository.auditRecord" />
</bean>
我的切入点是只拦截接口(服务接口)。服务方法可能是事务性的,也可能不是事务性的。如果服务方法是事务性的,我希望在建议由于某种原因失败时回滚该事务。
我的问题:为什么事务性注释被忽略了?这是我第一次使用Spring构建AOP服务,我也欢迎任何架构或实现改进。
谢谢!