Spring 3.2验证请求参数,ControllerAdvice不格式化响应

时间:2014-07-03 22:22:31

标签: java spring validation

我使用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)

虽然两者似乎都在进行验证。

1 个答案:

答案 0 :(得分:2)

@Valid @RequestBody的{​​{3}}可以这样说:

  

就像使用@ModelAttribute参数一样,可以使用Errors参数   用来检查错误。如果没有宣布这样的论证,a   将引发MethodArgumentNotValidException

这就是为@ExceptionHandler调用方法签名为MethodArgumentNotValidException的{​​{1}}的原因。

另一方面,如果没有@Valid @RequestBody,但@RequestBody没有额外的@Valid参数,则生成BindingResult,当前特定签名不会处理您的BindException。修复可能是为了使您的@ExceptionHandler更广泛,或者为BindException添加另一个@ExceptionHandler。更好的方法可能只是添加@ExceptionHandler作为附加参数。