我正在将现有的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
Run Code Online (Sandbox Code Playgroud)
一种选择是提供多个路径@RequestMapping.但是,这意味着每当在较新版本中添加API时,都会从所有旧控件中删除路径.实现这一目标的最优雅方式是什么?
我建议只使用继承:
Version1Controller.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";
}
}
Run Code Online (Sandbox Code Playgroud)
Version2Controller.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";
}
}
Run Code Online (Sandbox Code Playgroud)
您将在此处映射以下网址:
v1/foo - 返回"Foo 1"v2/foo - 返回"Foo 1" - 继承自版本1v1/bar - 返回"Bar 1"v2/bar - 返回"Bar 2" - 覆盖版本1的行为.latest/foo - 与...一样 v2/foolatest/bar - 与...一样 v2/bar| 归档时间: |
|
| 查看次数: |
1006 次 |
| 最近记录: |