2014-07-03 58 views
0

我使用JSR 303 @Valid來驗證控制器中的多個請求參數,這些參數與MultipartFile一起發佈。Spring 3.2驗證請求參數,ControllerAdvice不格式化響應

這驗證部分似乎是工作,

@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 


} 

看來,如果張貼PARAMS不匹配什麼是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) 

雖然兩者似乎確實執行驗證。

回答

2

documentation@Valid @RequestBody有這樣一段話:

就像使用@ModelAttribute參數,一個錯誤的說法可以用來檢查錯誤 。如果這樣的說法沒有被聲明,一個 MethodArgumentNotValidException將提高

這就是爲什麼與MethodArgumentNotValidException方法簽名您@ExceptionHandler被要求@Valid @RequestBody的原因。

在另一方面,而不@RequestBody@Valid,而無需額外的BindingResult參數,BindException獲取生成的,這會不會被你@ExceptionHandler當前特定簽名處理。修正可能會使@ExceptionHandler稍寬一些,或者爲BindException增加另一個@ExceptionHandler。更好的做法可能是將BindingResult作爲附加參數添加。