2017-04-24 48 views
7

Tôi có một ứng dụng khởi động mùa xuân, có bộ điều khiển MVC lò xo. Tôi đang cố gắng để phiên bản phần còn lại của tôi api bằng cách sử dụng chấp nhận tiêu đề.Bộ điều khiển MVC mùa xuân versioning

Sau đây là cách điều khiển của tôi trông giống như

RestController 
@RequestMapping(value = "/private/") 
public class AppleController { 

    private final AppleService appleService; 

    public AppleController(AppleService appleService) { 
    this.appleService = appleService; 
    } 

    @GetMapping(value = "apples/{id}", produces = "application/json; v=1.0", 
     headers = "Accept=application/json; v=1.0") 
    public ResponseEntity getByappleId(@PathVariable("id") Long appleId) { 
    System.out.println("version1"); 

    GetByappleIdResponse response = appleService.findByappleId(appleId); 

    return new ResponseEntity<>(response, HttpStatus.OK); 
    } 



    @GetMapping(value = "apples/{id}", produces = "application/json; v=2.0", 
     headers = "Accept=application/json; v=2.0") 
    public ResponseEntity getByappleId2(@PathVariable("id") Long appleId) { 
    System.out.println("version2"); 
    GetByappleIdResponse response = appleService.findByappleId2(appleId); 
    return new ResponseEntity<>(response, HttpStatus.OK); 
    } 

Không phân biệt phiên bản mà tôi đang đi qua trong Chấp nhận tiêu đề khi gọi API luôn "getByappleId" phương pháp được gọi là, do đó chỉ có phiên bản 1 phản ứng được trả về .

Có điều gì sai trong bộ điều khiển của tôi không?

+0

có vẻ như chấp nhận-params trong Chấp nhận tiêu đề không được sử dụng vào mùa xuân . –

+0

Có thể trùng lặp của http://stackoverflow.com/questions/34425316/spring-requestmapping-header-with-equals – heenenee

+0

tắt chủ đề không sử dụng system.out sử dụng logger bất cứ khi nào có thể –

Trả lời

2

Như đã trình bày trong câu trả lời này: https://stackoverflow.com/a/34427044/258813 (và đề cập trong các ý kiến) mùa xuân không hỗ trợ định tuyến sử dụng các tiêu đề như thế.

Nếu bạn muốn hỗ trợ định tuyến thông qua tiêu đề phiên bản, tôi sẽ đề xuất điều kiện định tuyến tùy chỉnh và chú thích - chắc chắn nếu bạn đang xây dựng một API lớn, nó sẽ dẫn đến ít mã hơn và giải pháp thanh lịch hơn.

Bạn sẽ xác định một số chú thích như @ApiVersion(1) mà bạn có thể thêm vào bất kỳ phương pháp nào cũng là ánh xạ yêu cầu và sau đó thêm điều kiện định tuyến tùy chỉnh và nó sẽ hoạt động chính xác.

tôi đã mô tả điều kiện sử dụng định tuyến tùy chỉnh và chú thích (dựa trên tên miền phụ - nhưng điều đó có thể dễ dàng được chuyển sang kiểm tra tiêu đề thay vì) ở đây: http://automateddeveloper.blogspot.co.uk/2014/12/spring-mvc-custom-routing-conditions.html

+0

Cảm ơn @rhinds cho phản hồi –

+0

Nó sẽ tốt hơn bao gồm một số ví dụ về mã – LoganMzz

4

Có nhiều lựa chọn để thực hiện phiên bản của REST API:

  • gợi ý trong cách tiếp cận bình luận cho tay định tuyến yêu cầu của bạn;
  • làm phiên bản như một phần của giá trị Chấp nhận tiêu đề của bạn, fe:

    (headers = "Accept=application/vnd.name.v1+json")

    (headers = "Accept=application/vnd.name.v2+json")

  • làm phiên bản như một phần của bản đồ của bạn:

    @GetMapping("apples/v1/{id})"

    @GetMapping("apples/v2/{id})

Vì vậy, bạn cần phải quyết định nên đi đường nào. Một số liên kết hữu ích:

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