web-dev-qa-db-ja.com

Spring Boot Rest Controllerは異なるHTTPステータスコードを返す方法は?

シンプルなREST AP​​Iに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を初めて使用する場合、基本的な質問は、何か問題が発生した場合や失敗した場合に、どのように異なるステータスコードを返すのですか?

74
Marco

使用できるオプションがいくつかあります。非常に良い方法は、@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に含まれています

90
Jakub Kubrynski

これを行う方法の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);

}
29
Ankit Basarkar

このコードを試してください:

@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));
}
2