2017-04-24 113 views
7

我有一個彈簧啓動應用程序,它有一個彈簧MVC控制器。我正在嘗試使用Accept標頭對我的其餘api進行版本化。彈簧MVC控制器版本

以下是我的控制器看起來像

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

的調用總是API時,我傳遞的Accept頭的版本無論「getByappleId」方法被調用,則返回1個響應因此,只有版本。

我的控制器有什麼問題嗎?

+0

好像頭不使用彈簧在接受接受-PARAMS 。 –

+0

可能的重複http://stackoverflow.com/questions/34425316/spring-requestmapping-header-with-equals – heenenee

+0

脫離主題不要使用system.out儘可能使用記錄器 –

回答

2

正如這個答案說明:https://stackoverflow.com/a/34427044/258813(並在評論中提到的)春不支持使用這樣的標題路由。

如果你想支持通過版本頭進行路由,我會推薦一個自定義的路由條件和註解 - 當然,如果你正在構建一個大的API,它將導致更少的代碼和更優雅的解決方案。

您可以定義一些註釋,如@ApiVersion(1),您可以將其添加到任何也是請求映射的方法,然後添加自定義路由條件並且它將正常工作。

我一直在使用自定義路由條件和註釋說明(基於子域 - 但可以很容易地切換到檢查頭代替)位置:http://automateddeveloper.blogspot.co.uk/2014/12/spring-mvc-custom-routing-conditions.html

+0

感謝@rbackss的迴應 –

+0

它會更好包括一些代碼示例 – LoganMzz

4

有實現REST API的版本很多選擇:

  • 建議在手動佈置您的要求的意見的方式;
  • 製作版本,您接受頭值的一部分,FE:

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

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

  • 製作版本的映射的一部分:

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

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

所以你需要決定走哪條路。一些有用的鏈接: