@Transactional 어노테이션이 포함 된 Aspect를 만들었습니다. 내 충고는 예상대로 호출되지만 새로운 엔터티 AuditRecord는 데이터베이스에 저장되지 않습니다. 내 @Transactional 주석이 작동하지 않는 것처럼 보입니다. 다음과 같이@ 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;
}
}
빈 컨텍스트는 다음과 같습니다
<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>
내 포인트 컷은 인터페이스 (서비스 인터페이스)를 차단한다. 서비스 메소드는 트랜잭션이 될 수도 있고 그렇지 않을 수도 있습니다. 서비스 메소드가 트랜잭션 인 경우, 어떤 이유로 Advice가 실패하면 해당 트랜잭션을 롤백하고 싶습니다.
내 질문 : 왜 트랜잭션 주석이 무시됩니까? AOP 서비스를 Spring으로 구축 한 것은 이번이 처음이며, 아키텍처 또는 구현 개선을 환영합니다.
감사합니다.