java - 在 Spring 3.2 MVC 中使用 fall-through 的 API 版本控制

标签 java spring-mvc

我正在将现有的 Web 服务移植到 Spring 3.2。我需要版本化的 API,并且每个新版本都有一个 Controller 。我不想在较新的 Controller 中重新定义方法,而是希望在最新 Controller 中找不到时自动将请求映射到旧 Controller 。

例如,如果 ControllerV1/home/loginControllerV2/login ,那么我希望请求像这样被路由。

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

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

一种选择是在@RequestMapping 中提供多个路径。但是,这意味着每当在新版本中添加 API 时,都会从所有旧 Controller 中删除路径。实现这一目标的最优雅方法是什么?

最佳答案

我建议为此简单地使用继承:

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

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

}

在这里您将映射以下 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
  • 相同

关于java - 在 Spring 3.2 MVC 中使用 fall-through 的 API 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14080684/

相关文章:

java - ArrayList 作为 HashMap 中的键

spring - 如何验证动态生成的字段服务器端

java - 扫描仪始终需要两个输入(Java)

java - 尝试将字符串 append 到自定义 StringBuilder 时出现重复且不正确的结果

java - 如何从jtable中删除一行

html - xslt: css 在 html 页面中不工作

java - RESTful Web 服务框架与 Spring MVC REST 支持的比较

spring - 未触发 AuthenticationSuccessEvent 或 InteractiveAuthenticationSuccessEvent 的 @EventListener

html - 在 spring-mvc 中处理同名的多个 <input>

java - 如何仅过滤使用我的自定义注释进行注释的 api