在Spring 3.2 MVC中使用API​​进行API版本控制

Cha*_*kar 1 java spring-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
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*pov 5

我建议只使用继承:

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" - 继承自版本1
  • v1/bar - 返回"Bar 1"
  • v2/bar - 返回"Bar 2" - 覆盖版本1的行为.
  • latest/foo - 与...一样 v2/foo
  • latest/bar - 与...一样 v2/bar