我有一个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;
}
答案 0 :(得分:4)
您可以在控制器中使用多个InitBinder
方法。它由可选的值参数控制。对于InitBinder
的javadoc: String []值:此init-binder方法应该应用于的命令/表单属性和/或请求参数的名称...指定模型属性名称或请求这里的参数名称将init-binder方法限制为那些特定的属性/参数,不同的init-binder方法通常适用于不同的属性或参数组。
另一种方法是在特定方法中探索性地调用补充的Validator。
BTW:我在控制器方法签名中看不到任何Errors
或BindingResult
:您在哪里可以找到是否发生错误?
答案 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
,这让我可以自由地自定义处理响应。