spring 带有附加参数的方面 java 的验证器

spring validator with around aspect java with additional argument

如何在 spring 验证器中使用特定参数,我不能将参数合并到单个对象中?

假设我有一个控制器,

 @RequestMapping(value = "url",
          consumes = { "application/json" }, produces = { "application/json" },
          method = RequestMethod.POST)
  public MyResponse getMyData(
          @Valid @RequestBody MyRequest myRequest, Errors errors, CustomObject obj){
         return new MyResponse();
}

我有一个用于更新 CustomObject

的方面实现
 @Around("@annotation(MyAnnotation) && execution(* MyController.getMyData(..))")
        public Object requestsAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){
            Object value = null;
            CustomObject obj = new CustomObject();
            try {
                Object[] args = proceedingJoinPoint.getArgs();
                //populate CustomObject
                obj = (CustomObject)args[2];
                obj.setField("value");
                value = proceedingJoinPoint.proceed(args);
            } catch (Throwable e) {
                e.printStackTrace();
            }
            return value;
        }

我可以在控制器中获取 CustomObject 的更新值。现在我需要验证 MyRequest 也使用 spring 自定义验证器,例如

@InitBinder
  protected void initBinder(WebDataBinder binder) {
    binder.addValidators(new MyCustomValidator());
  }

而 MyCustomValidator 的 'validate()' 函数是,

@Override
  public void validate(Object target, Errors errors) {
   validate((MyRequest)target);
}

方面和验证都是分开工作的,但是当两者集成时,验证失败,因为验证方法中的目标考虑使用“CustomObject”进行验证,而不是使用“[=28=” ]我的请求'。 Validate 方法将只接受两个参数,而控制器中的 'getMyData()' 方法有三个。如何解决这个问题或者是否有任何其他方法可以实现类似的解决方案?

您可以尝试将要验证的对象的名称分配给 initBinder(使用对象实例的名称,而不是 class)。

InitBinder("myRequest")
protected void initBinder(WebDataBinder binder) {
... 

如果它不起作用,您可以尝试使用 Order 注释向 方面 发出命令,或实施 订单界面。

无论如何,我对前两个选项的正确性没有完全的信心,因为我无法测试代码(我在平板电脑上回答)。所以,我还建议第三种选择,将验证放在控制器中

@RequestMapping(value = "url",
      consumes = { "application/json" }, 
      produces = {"application/json" },
      method = RequestMethod.POST)
public MyResponse getMyData(
      @RequestBody MyRequest myRequest, BindingResult result, CustomObject obj){
    MyCustomValidator validator = MyCustomValidator();
    validator.validate(myRequest, result);

    if (result.hasErrors()){
      // do something
    }

    return new MyResponse();
}