2014-06-18 25 views
44

Tôi đang sử dụng Khởi động mùa xuân cho một API REST đơn giản và muốn trả lại mã trạng thái HTTP chính xác nếu có điều gì đó không thành công.Spring Boot Rest Điều khiển cách trả về các mã trạng thái HTTP khác nhau?

@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? 
} 

Là mới đến mùa xuân và mùa xuân Boot, câu hỏi cơ bản là làm thế nào để tôi trở về mã trạng thái khác nhau khi một cái gì đó là ok hay thất bại?

Trả lời

63

Có một số tùy chọn bạn có thể sử dụng. cách khá tốt là sử dụng ngoại lệ và lớp để xử lý gọi @ControllerAdvice:

@ControllerAdvice 
class GlobalControllerExceptionHandler { 
    @ResponseStatus(HttpStatus.CONFLICT) // 409 
    @ExceptionHandler(DataIntegrityViolationException.class) 
    public void handleConflict() { 
     // Nothing to do 
    } 
} 

Ngoài ra bạn có thể vượt qua HttpServletResponse để điều khiển phương pháp và chỉ cần thiết lập mã phản hồi:

public RestModel create(@RequestBody String data, HttpServletResponse response) { 
    // code ommitted.. 
    response.setStatus(HttpServletResponse.SC_ACCEPTED); 
} 

Vui lòng tham khảo bài viết trên blog tuyệt vời cho chi tiết : http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

lưu ý: Trong khởi động mùa xuân sử dụng @ResponseBody chú thích là thừa - được bao gồm trong @RestController

+0

Cũng như bình luận, tôi đã làm một bài kiểm tra 15 phút trước, và một '@RestController' mà không có chú thích '@ResponseBody' trên phương pháp của ông đặt chuỗi trả lại không bên trong cơ thể nhưng như ForwardedURL. Tôi khá noob với spring/springboot bản thân của tôi vì vậy không thể chỉ ra lý do tại sao – Anearion

+0

@Anearion Có lỗi đánh máy trong câu trả lời - chúng tôi thực sự cần '@RestControllerAdvice', chứ không phải '@RestController'. – yoliho

+0

Nó không phải là lỗi đánh máy. Phần này liên quan đến câu hỏi và chú thích trên bộ điều khiển –

1

Một trong những cách để làm điều này là bạn có thể sử dụng ResponseEntity như một đối tượng trả về.

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

} 
0

Hãy thử mã này:

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

Vì đây là một câu hỏi khá cũ nên bạn nên thêm thông tin về gói và phiên bản mà bạn giới thiệu. – ZF007

Các vấn đề liên quan