残業続きで眠いです……。誤字脱字は勘弁してね(´・ω・`)
クライアントからPOSTされたJSONを受け取って、JSONを返すようなコントローラの開発中、POSTされるJSONを何かしらのBeanにマッピングさせ、かつBeanValidationを機能させたいとします。
@Controller
public HogeController {
@RequestMapping(path="/hoge",
method=RequestMethod.POST,
consumes=MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Map<String, String> hoge(@RequestBody @Valid JsonBean jsonBean)
// do something
}
}
このときJsonBean
に設定されたBean Validatorが機能して、JSONがBeanにマッピングされない場合、そのメソッドの中(上記の例ではhoge
メソッドの中)には入っていきません。つまりクライアント側にはJSONが返されず、次のようなエラーメッセージを持ったHTMLが返されてしまうのです。
Error 400 The request sent by the client was syntactically incorrect
対処法としては__MethodArgumentNotValidException
を受けるExceptionHandlerを設定する__ことです。
@Controller
public HogeController {
@RequestMapping(path="/hoge",
method=RequestMethod.POST,
consumes=MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public Map<String, String> hoge(@RequestBody @Valid JsonBean jsonBean)
// do something
}
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Map<String, String> hogeHandler(MethodArgumentNotValidException e){
// do something
}
}
こうすることにより、POSTされたJSONがBeanにマッピングされない場合は、MethodArgumentNotValidException
を受けるExceptionHandler(上記の例ではhogeHandler
)が実行されます。つまりマッピングされない場合にクライアントに返したいJSONをこのExceptionHandlerの戻り値にしてやればよいということになります。