我有一个将更新字段的方法,但是我想在执行该方法之前检查该值,以便确定操作(编辑/添加/删除)。

@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()方法后,我想记录该事件,但要使用在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;
}

07-25 23:58