多个Spring MVC验证器用于同一个Controller

时间:2014-10-13 13:18:27

标签: java spring validation spring-mvc

我有一个Spring控制器,其Validator定义为:

    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setValidator(new MyValidator(myService));
    }

并称之为:

public ResponseEntity<?> executeSomething(
   @ApiParam(name = "monitorRequest", required = true, value = "") @Valid @RequestBody MonitorRequest monitorRequest,
   HttpServletRequest request, HttpServletResponse response) throws RESTException

我需要为此控制器添加一个Validator,可以从此控制器的某些特定方法调用。有没有办法实现这个目标?

编辑:我正在处理错误:

@ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public ResponseEntity<?> processValidationError(MethodArgumentNotValidException ex) {
        BindingResult result = ex.getBindingResult();
        List<FieldError> fieldErrors = result.getFieldErrors();
        ValidationErrorObj obj =  processFieldErrors(fieldErrors);
        ResponseEntity r = new ResponseEntity(obj, HttpStatus.BAD_REQUEST);
        return r;
    }

2 个答案:

答案 0 :(得分:4)

您可以在控制器中使用多个InitBinder方法。它由可选的值参数控制。对于InitBinder的javadoc: String []值:此init-binder方法应该应用于的命令/表单属性和/或请求参数的名称...指定模型属性名称或请求这里的参数名称将init-binder方法限制为那些特定的属性/参数,不同的init-binder方法通常适用于不同的属性或参数组

另一种方法是在特定方法中探索性地调用补充的Validator。

BTW:我在控制器方法签名中看不到任何ErrorsBindingResult:您在哪里可以找到是否发生错误?

答案 1 :(得分:3)

对于那些仍在努力弄清楚如何在2017年解决这个问题的人。在我的RestController中尝试实现2个验证器时,我遇到了类似的问题。我按照@Serge Ballasta上面提到的方法。

我最终制作了2个模型,每个模型链接到他们的特定验证器。 Controller方法看起来像

@RequestMapping(value = "register", method = RequestMethod.POST)
public ResponseEntity<User> register(@Valid @RequestBody UserRegisterRequest userRegisterRequest) {
    return null;
}

@RequestMapping(value = "test", method = RequestMethod.POST)
public ResponseEntity<?> test(@Valid @RequestBody TestRequest testRequest) {
    return null;
}

我创建了2个initBinder来连接控制器中的这些验证器,如

@InitBinder("testRequest")
public void setupBinder(WebDataBinder binder) {
    binder.addValidators(testValidator);
}

@InitBinder("userRegisterRequest")
public void setupBinder1(WebDataBinder binder) {
    binder.addValidators(userRegistrationRequestValidator);
}

请注意,@ ReitBinder属性(userRegisterRequest,testRequest)必须作为@InitBinder()注释中的值提供。

顺便说一句,在我的代码中,我在一个自定义的ExceptionHandler类中处理bindingResult,该类扩展了ResponseEntityExceptionHandler,这让我可以自由地自定义处理响应。