シンプルなREST APIにSpring Bootを使用していますが、何かが失敗した場合に正しいHTTPステータスコードを返したいです。
@RequestMapping(value="/rawdata/", method = RequestMethod.PUT)
@ResponseBody
@ResponseStatus( HttpStatus.OK )
public RestModel create(@RequestBody String data) {
// code ommitted..
// how do i return a correct status code if something fails?
}
SpringとSpring Bootを初めて使用する場合、基本的な質問は、何か問題が発生した場合や失敗した場合に、どのように異なるステータスコードを返すのですか?
使用できるオプションがいくつかあります。非常に良い方法は、@ControllerAdvice
と呼ばれる処理のために例外とクラスを使用することです:
@ControllerAdvice
class GlobalControllerExceptionHandler {
@ResponseStatus(HttpStatus.CONFLICT) // 409
@ExceptionHandler(DataIntegrityViolationException.class)
public void handleConflict() {
// Nothing to do
}
}
また、HttpServletResponse
をコントローラーメソッドに渡し、応答コードを設定することもできます。
public RestModel create(@RequestBody String data, HttpServletResponse response) {
// code ommitted..
response.setStatus(HttpServletResponse.SC_ACCEPTED);
}
詳細については、素晴らしいブログ記事を参照してください: http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc
注:@ResponseBody
アノテーションを使用したSpring Bootでは冗長です-@RestController
に含まれています
これを行う方法の1つは、ResponseEntityを戻りオブジェクトとして使用できることです。
@RequestMapping(value="/rawdata/", method = RequestMethod.PUT)
public ResponseEntity<?> create(@RequestBody String data) {
if(everything_fine)
return new ResponseEntity<>(RestModel, HttpStatus.OK);
else
return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
}
このコードを試してください:
@RequestMapping(value = "/validate", method = RequestMethod.GET, produces = "application/json")
public ResponseEntity<ErrorBean> validateUser(@QueryParam("jsonInput") final String jsonInput) {
int numberHTTPDesired = 400;
ErrorBean responseBean = new ErrorBean();
responseBean.setError("ERROR");
responseBean.setMensaje("Error in validation!");
return new ResponseEntity<ErrorBean>(responseBean, HttpStatus.valueOf(numberHTTPDesired));
}