如何在Spring控制器方法上的@ Valid / @ Validated注释之前执行Spring方面?

Mir*_*cea 6 validation aop spring spring-aop

我有这个服务/控制器方法:

public ResponseEntity<PolicyDTO> addPolicy(@Valid @RequestBody PolicyDTO policy)
        throws InternalServerException, BadRequestException {
    log.debug("Adding a new policy");
}
Run Code Online (Sandbox Code Playgroud)

注意方法参数中的@Valid批注

对于此控制器,我们定义了以下方面类:

@Aspect
@Component
public class BackwardsCompatibilityHandler {
@Around("execution(* com.company.PolicyController.addPolicy(..))")
public Object ControllerMethod(JoinPoint jp) 
{
    // DO Code before and after the method call
}
Run Code Online (Sandbox Code Playgroud)

这方面/代理背后的主要原因是拦截方法调用,并对输入参数/返回的结果进行一些前/后处理。

我们现在面临的主要问题是@Valid批注在实际执行代码之前和之后的方面之前进行处理。

关于如何使验证检查在AOP代码中运行的任何想法?我知道有一种方法可以通过手动调用方法内部的验证器来做到这一点,但是我不想过多地触摸现有代码...因此,除此以外,还有其他任何想法...

现在执行的顺序是:

  1. 验证检查-由@Valid注释触发
  2. 自己的代码-方面-方法调用之前
  3. 实际方法调用
  4. 自己的代码-方面-方法调用后

我们希望有更多类似的东西(首先是我们的代码,然后是Valid注释):

  1. 自己的代码-方面-方法调用之前
  2. 验证检查-由@Valid注释触发
  3. 实际方法调用
  4. 自己的代码-方面-方法调用后

请跳过编译器错误等,该代码仅用于演示目的,不是真正的代码:)

小智 0

在您的应用程序中添加以下控制器建议。

@ControllerAdvice
public class ApplicationControllerAdvice {

@InitBinder
@<YourCustomAnnotation>
protected void activateBeanPropertyAccess(DataBinder dataBinder) {
    dataBinder.initBeanPropertyAccess();
}
}
Run Code Online (Sandbox Code Playgroud)

@YourCustomAnnotation 应调用 BackwardsCompatibilityHandler 类。因此,在此之后将调用所有约束验证器。