首页 文章

Spring Boot Rest Controller如何返回不同的HTTP状态代码?

提问于
浏览
54

我使用Spring Boot作为一个简单的REST API,并希望在出现故障时返回正确的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的新手,基本的问题是,当某些东西正常或失败时,我如何返回不同的状态代码?

3 回答

  • 0

    您可以使用多种选项 . 相当不错的方法是使用异常和类来处理名为 @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

    注意:在Spring Boot中使用 @ResponseBody 注释是多余的 - 它包含在 @RestController

  • 77

    其中一种方法是使用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);
    
    }
    
  • 13

    试试这段代码:

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

相关问题