@Before 和@AfterReturning 组合是否可行?

Is @Before and @AfterReturning combination possible?

我有一个方法可以更新字段,但我想在执行该方法之前检查值,以便确定操作 (edit/add/delete)。

@Before(value = "execution(* com.test.app.*.service.DefaultBirthRegistrationService.updateRegistrationField(..)) && args(referenceNumber, fieldDetails)")
    public void assignAction(String referenceNumber, BirthRegistrationField fieldDetails) {
        Action action = birthRegistrationService.determineUpdateAction(referenceNumber, fieldDetails, Action.EDITED);
    }

然后在updateRegistrationField()方法成功执行后我想记录事件,但是with action中设置的值@Before。我 不想 记录事件以防 updateRegistrationField() 失败。这就是为什么我要使用 @AfterReturning. 这是 @AfterReturning:

的代码
@AfterReturning(pointcut = "execution(* com.test.app.*.service.DefaultBirthRegistrationService.updateRegistrationField(..)) && args(referenceNumber, fieldDetails)")
    public void editEvent(String referenceNumber, BirthRegistrationField fieldDetails) {
        audit(referenceNumber, action, fieldDetails.getName());
    }

变量action,应为@Before中赋值。

这可能吗?

我也看过使用 @Around 但问题是我只想在 执行方法之前执行一部分代码,而一部分 执行该方法后的代码。

假设 DefaultBirthRegistrationService.updateRegistrationField() 在操作失败时抛出异常,以下代码应该适用于您的情况。

@Around(value = "execution(* com.test.app.*.service.DefaultBirthRegistrationService.updateRegistrationField(..)) && args(referenceNumber, fieldDetails)")
public Object assignActionAndAuditEvent(ProceedingJoinPoint joinPoint,String referenceNumber, BirthRegistrationField fieldDetails) throws Throwable {
    Action action = birthRegistrationService.determineUpdateAction(referenceNumber, fieldDetails, Action.EDITED);
    Object res = joinPoint.proceed();
    audit(referenceNumber, action, fieldDetails.getName());     
    return res;
}