簡體   English   中英

Spring 3.2 MVC中的API版本控制

[英]API versioning with fall-through in Spring 3.2 MVC

我正在將現有的Web服務移植到Spring 3.2。 我需要版本化的API,並且每個新版本都有一個控制器。 我不想在較新的控制器中重新定義方法,而是想自動將請求映射到舊的控制器(如果在最新的控制器中找不到)。

例如,如果ControllerV1具有/home/loginControllerV2具有/login ,則我希望這樣路由請求。

/home -> ControllerV1
/v1/home -> ControllerV1
/v2/home -> ControllerV1

/login -> ControllerV1
/v1/login -> ControllerV1
/v2/login -> ControllerV2

一種選擇是在@RequestMapping提供多個路徑。 但是,這意味着每當在較新版本中添加API時,都將從所有較舊的controllesr中刪除路徑。 實現這一目標的最優雅的方法是什么?

我建議為此簡單地使用繼承:

版本1Controller.java

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("v1/")
public class Version1Controller {

    @ResponseBody
    @RequestMapping("foo")
    public String foo() {
        return "Foo 1";
    }

    @ResponseBody
    @RequestMapping("bar")
    public String bar() {
        return "bar 1";
    }
}

版本2Controller.java

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping({ "v2/", "latest/" })
public class Version2Controller extends Version1Controller {

    @Override
    @ResponseBody
    @RequestMapping("bar")
    public String bar() {
        return "bar 2";
    }

}

在這里,您將映射以下URL:

  • v1/foo返回“ Foo 1”
  • v2/foo返回“ Foo 1”-從版本1繼承
  • v1/bar返回“ Bar 1”
  • v2/bar返回“ Bar 2”-從版本1覆蓋行為。
  • latest/foov2/foo相同
  • latest/bar -與v2/bar相同

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM