1

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

例如,如果ControllerV1has/home和has /login,那么我希望请求像这样路由。ControllerV2/login

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

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

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

4

1 回答 1

5

我建议简单地使用继承:

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

版本2控制器.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";
    }

}

在这里,您将映射以下网址:

  • v1/foo- 返回“Foo 1”
  • v2/foo- 返回 "Foo 1" - 从版本 1 继承
  • v1/bar- 返回“酒吧 1”
  • v2/bar- 返回“Bar 2” - 覆盖版本 1 的行为。
  • latest/foo- 如同v2/foo
  • latest/bar- 如同v2/bar
于 2012-12-31T13:14:44.723 回答