首页 > 解决方案 > @Before 和 @AfterReturning 组合可能吗?

问题描述

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

@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,但问题是我只想在执行方法之前执行一部分代码,在执行方法之后执行一部分代码。

标签: javaspringspring-bootannotations

解决方案


假设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;
}

推荐阅读