1

既存の Web サービスを Spring 3.2 に移植しています。バージョン管理された API が必要で、新しいバージョンごとにコントローラーがあります。新しいコントローラーでメソッドを再定義したくありません。代わりに、最新のコントローラーに見つからない場合は、古いコントローラーにリクエストを自動的にマップしたいと考えています。

たとえば、 has と has の場合、ControllerV1リクエスト/homeを次のようにルーティングします。/loginControllerV2/login

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

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

1 つのオプションは、で複数のパスを提供すること@RequestMappingです。ただし、これは、API を新しいバージョンに追加するたびに、すべての古いコントローラーからパスを削除することを意味します。これを達成するための最もエレガントな方法は何ですか?

4

1 に答える 1

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

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-「Foo1」を返す
  • v2/foo-「Foo1」を返す-バージョン1から継承
  • v1/bar-「バー1」を返す
  • v2/bar-「バー2」を返します-バージョン1からの動作をオーバーライドします。
  • latest/foo- と同じv2/foo
  • latest/bar- と同じv2/bar
于 2012-12-31T13:14:44.723 に答える