[英]API versioning with fall-through in Spring 3.2 MVC
我正在將現有的Web服務移植到Spring 3.2。 我需要版本化的API,並且每個新版本都有一個控制器。 我不想在較新的控制器中重新定義方法,而是想自動將請求映射到舊的控制器(如果在最新的控制器中找不到)。
例如,如果ControllerV1
具有/home
和/login
而ControllerV2
具有/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/foo
與v2/foo
相同 latest/bar
-與v2/bar
相同
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.