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

时间:2017-09-01 00:51:07

标签: java spring validation aop

如何利用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

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

MyCustomValidator'验证()'功能是,

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

方面和验证都是单独工作的,但是当两者都集成时,验证失败,因为验证方法中的目标考虑了 CustomObject '用于验证而不是使用' MyRequest '。 ' getMyData()'验证方法只接受两个参数。控制器中的方法有三个。如何解决这个问题,还是有其他办法来实现类似的解决方案?

1 个答案:

答案 0 :(得分:0)

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

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

如果它不起作用,您可以尝试使用订单注释向方面下订单,或者执行订单< / strong>界面。

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

@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();
}