Tôi đã tạo một Aspect chứa chú thích @Transactional. Lời khuyên của tôi đang được gọi như mong đợi, nhưng thực thể mới AuditRecord không bao giờ được lưu vào cơ sở dữ liệu, có vẻ như chú thích @Transactional của tôi không hoạt động.Spring @Transactional in a Aspect (AOP)
@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;
}
}
Bối cảnh đậu là như sau:
<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>
pointcut tôi hiện đang chặn các giao diện duy nhất (giao diện dịch vụ). Các phương thức dịch vụ có thể hoặc không thể giao dịch. Nếu phương thức dịch vụ là giao dịch, tôi muốn giao dịch đó được khôi phục nếu lời khuyên không thành công vì một lý do nào đó.
Câu hỏi của tôi: Tại sao chú thích giao dịch bị bỏ qua? Đây là lần đầu tiên tôi xây dựng dịch vụ AOP với Spring, tôi cũng sẽ hoan nghênh mọi cải tiến về kiến trúc hoặc triển khai.
Cảm ơn!