我使用JSR 303 @Valid
来验证控制器中的多个请求参数,这些参数与MultipartFile
一起发布。
这个验证部分似乎有效,
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public @ResponseBody
Response upload(@RequestParam(value = "file", required = true) MultipartFile file,
@Valid ValidBean bean) {
//method
}
ValidBean
是字符串,长整数和List<String>
的集合。
public class ValidBean{
@NotNull
String someString;
@Size(min = 1, max=10)
String anotherString;
//getters, setters, random been goodness
}
如果发布的参数与ValidBean
中定义的参数不匹配,则客户似乎会被拒绝。
我遇到问题的地方是我的全球@ControllerAdvice ValidationHandler
。
@ControllerAdvice
public class ValidationHandler {
@ExceptionHandler
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
public @ResponseBody
StatusContext handleArgumentNotValid( MethodArgumentNotValidException error ){
//format and return response
}
我的@ExceptionHandler
似乎只在使用@RequestBody @Valid
因此,此方法返回格式化的响应
@RequestMapping(value = "/works", method = RequestMethod.POST)
public @ResponseBody
Formatted addUser(@RequestBody @Valid ValidBean user)
这个没有,
@RequestMapping(value = "/noGood", method = RequestMethod.POST)
public @ResponseBody
NotFormatted addUser(@Valid ValidBean user)
虽然两者似乎都在进行验证。
答案 0 :(得分:2)
@Valid @RequestBody
的{{3}}可以这样说:
就像使用@ModelAttribute参数一样,可以使用Errors参数 用来检查错误。如果没有宣布这样的论证,a 将引发MethodArgumentNotValidException
这就是为@ExceptionHandler
调用方法签名为MethodArgumentNotValidException
的{{1}}的原因。
另一方面,如果没有@Valid @RequestBody
,但@RequestBody
没有额外的@Valid
参数,则生成BindingResult
,当前特定签名不会处理您的BindException
。修复可能是为了使您的@ExceptionHandler
更广泛,或者为BindException添加另一个@ExceptionHandler
。更好的方法可能只是添加@ExceptionHandler
作为附加参数。