2014-10-01 16 views
23

Tôi đang cố gắng để có một @RestController mất @PathVariable trả về một đối tượng cụ thể ở định dạng JSON, cùng với mã trạng thái thích hợp. Cho đến nay, mã này sẽ trả về đối tượng ở định dạng JSON vì nó đang sử dụng Spring 4 được xây dựng trong thư viện Jackson theo mặc định.Cách phản hồi với mã trạng thái HTTP trong lớp Spring MVC @RestController @ResponseBody trả về một đối tượng?

Tuy nhiên tôi không biết cách tạo nó để người dùng nói rằng chúng tôi muốn biến api, sau đó là dữ liệu JSON, sau đó mã lỗi (Hoặc mã thành công tùy thuộc vào mọi thứ đều ổn). đầu ra ví dụ sẽ là:

Vui lòng nhập giá trị api như tham số (LƯU Ý này có thể ở JSON cũng như nếu cần thiết)

{ "id": 2, "api": "3000105000" ... } (LƯU Ý này sẽ là đối tượng phản ứng JSON)

Status mã 400 (OR mã trạng thái thích hợp)


url với tham số trông giống như

này 012.
http://localhost:8080/gotech/api/v1/api/3000105000 

Code tôi có cho đến nay:

@RestController 
@RequestMapping(value = "/api/v1") 
public class ClientFetchWellDataController { 

    @Autowired 
    private OngardWellService ongardWellService; 

    @RequestMapping(value = "/wells/{apiValue}", method = RequestMethod.GET) 
    @ResponseBody 
    public OngardWell fetchWellData(@PathVariable String apiValue){ 
     try{ 
      OngardWell ongardWell = new OngardWell(); 
      ongardWell = ongardWellService.fetchOneByApi(apiValue); 

      return ongardWell; 
     }catch(Exception ex){ 
      String errorMessage; 
      errorMessage = ex + " <== error"; 
      return null; 
     } 
    } 
} 

Trả lời

47

Một @RestController là không thích hợp cho việc này. Nếu bạn cần trả lại các loại phản hồi khác nhau, hãy sử dụng ResponseEntity<?> nơi bạn có thể đặt mã trạng thái một cách rõ ràng.

body của số ResponseEntity sẽ được xử lý theo cách tương tự như giá trị trả lại của bất kỳ phương thức được chú thích nào là @ResponseBody.

@RequestMapping(value = "/wells/{apiValue}", method = RequestMethod.GET) 
public ResponseEntity<?> fetchWellData(@PathVariable String apiValue){ 
    try{ 
     OngardWell ongardWell = new OngardWell(); 
     ongardWell = ongardWellService.fetchOneByApi(apiValue); 

     return new ResponseEntity<>(ongardWell, HttpStatus.OK); 
    }catch(Exception ex){ 
     String errorMessage; 
     errorMessage = ex + " <== error"; 
     return new ResponseEntity<>(errorMessage, HttpStatus.BAD_REQUEST); 
    } 
} 

Lưu ý rằng bạn không cần @ResponseBody trên một phương pháp @RequestMapping trong một lớp chú thích @RestController.

26

Cách thành ngữ sẽ là sử dụng trình xử lý ngoại lệ thay vì bắt ngoại lệ trong phương thức xử lý yêu cầu thông thường của bạn. Loại ngoại lệ xác định mã phản hồi. (403 đối với lỗi bảo mật, 500 đối với trường hợp ngoại lệ nền tảng không mong muốn, bất kể bạn thích gì)

@ExceptionHandler(MyApplicationException.class) 
@ResponseStatus(HttpStatus.BAD_REQUEST) 
public String handleAppException(MyApplicationException ex) { 
    return ex.getMessage(); 
} 

@ExceptionHandler(Exception.class) 
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) 
public String handleAppException(Exception ex) { 
    return ex.getMessage(); 
} 
+0

mmmmm kinda có ý nghĩa, vậy mã hiện tại của tôi sẽ đi đâu? Hoặc là mã bạn đăng điều riêng của mình mà tôi sẽ gọi để xử lý các ngoại lệ của tôi? Xin lỗi tôi đã không bao giờ nhìn thấy mã như thế trước đây, trông rất hữu ích mặc dù cảm ơn vì sự giúp đỡ – Cris

+1

Nó đi trong cùng một bộ điều khiển như mã của bạn. Chỉ cần dùng thử phương pháp xử lý. – Affe

+0

Điều này là rất hữu ích và tốt hơn cách viết RestAPIs tôi nghĩ. Nếu tôi có nhiều bộ điều khiển, tôi có phải viết các trình xử lý này cho tất cả các bộ điều khiển hay tôi có thể đặt chúng trong lớp cơ sở hoặc trong giao diện và sử dụng nó không? – shraddha

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