Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring 3.2验证请求参数,ControllerAdvice未格式化响应_Java_Spring_Validation - Fatal编程技术网

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

Java Spring 3.2验证请求参数,ControllerAdvice未格式化响应,java,spring,validation,Java,Spring,Validation,我正在使用JSR303@Valid验证控制器中的多个请求参数,这些参数与一个多部分文件一起发布 验证部分似乎正在发挥作用 @RequestMapping(value = "/upload", method = RequestMethod.POST) public @ResponseBody Response upload(@RequestParam(value = "file", required = true) MultipartFile file, @Vali

我正在使用JSR303
@Valid
验证控制器中的多个请求参数,这些参数与一个
多部分文件一起发布

验证部分似乎正在发挥作用

@RequestMapping(value = "/upload", method = RequestMethod.POST)
public @ResponseBody
Response upload(@RequestParam(value = "file", required = true) MultipartFile file,
                @Valid ValidBean bean) {

    //method
}
ValidBean
是字符串、长字符串和
列表的集合

如果发布的参数与
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)
尽管这两种方法似乎都在实际执行验证。

for
@Valid@RequestBody
有这样一句话:

与@modeldattribute参数一样,可以使用Errors参数 用于检查错误。如果未声明此类参数,则 将引发MethodArgumentNotValidException

这就是为什么方法签名为
MethodArgumentNotValidException
@ExceptionHandler
会被调用为
@Valid@RequestBody

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

@RequestMapping(value = "/noGood", method = RequestMethod.POST)
public @ResponseBody
NotFormatted addUser(@Valid ValidBean user)