2015-11-14 30 views
6

私は春のブートを使用してAPIを作成していますが、私のすべてのリソースを共通のベースパス(この場合は/ api)の後ろにマッピングしたいと思います。しかし、私はRestControllerクラスに注釈をつけたくありません(@RequestMappingで注釈を付けるなど)。 は、私は次の解決策について考えているが、それらはすべて、私はむしろたくないダウンサイドがあります。スプリングブート:複数のRestControllersの共通パスを設定する方法

  • ベースクラス(例えばApiRestController)を作成し、他のすべてのRestControllerはこの1つを継承有します。これは、クラスレベルの@Requestmappingが基本クラスと実装クラスの間でマージされないという欠点があります。
  • すべてのRestControllerに注釈を付けるが、これはコードの重複につながる。
  • server.context-pathプロパティを変更する。これには、すべてのエンドポイントがこの基本パスを使用するという欠点があります。アクチュエーター・プロジェクトによって公開されたエンドポイントさえ。
  • カスタムDispatcherServletとServletRegistrationBeanを使用します。しかし、これはserver.context-pathを変更するのと同じ効果があるようです。

誰もがソリューションが私が合計した欠点なしでこれを行う方法を知っています。プロジェクトでは、RESTベースのバックエンドのみが公開され、静的コンテンツはサーバーされません(可能性のあるソリューションに影響するかどうかはわかりません)。 Restcontrollerは、複数のパッケージにまたがっています。

ありがとうございました。

+0

私が正しく理解していれば、この機能について話している春の問題があります:https://jira.spring.io/browse/SPR-16336 – Dherik

答えて

3

@RequestMapping( "/ api")をすべてのRestControllersに入れないのはなぜですか?

@RestController 
@RequestMapping("/api") 
public class UserApi { 
    @RequestMapping("/user") 
    public String user() { 
     ... 
    } 
} 
+2

可能であれば、このコードの重複を避けたいと思います。 ))、それを忘れることの変更が常にあります –

+0

あなたが忘れた場合、あなたはエラーを受け取り、それで十分です。ポルトガル語では、「preciosismo」という言葉があります。 –

+0

これは、すべてのコントローラに共通のコンテキストパスを追加するのではなく、各コントローラに別々に追加しています。 –

1

あなたは@RestController@RequestMappingが含まれるカスタムアノテーションを作成しようとすることができます

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.TYPE) 
@RestConntroller 
@RequestMapping(value = "/api") 
@interface MyController { 

} 
+0

私はこのアノテーションをクラスと "@RequesMapping"に入れても同じ問題が起こると思います(そのクラスのすべてのリソースがパス/ api/userの下にあるため)、2つの "@RequestMapping"アノテーションは合併するのか、それとも間違っているのか? –

+0

アノテーションをクラスに追加し、アノテーションをメソッドに追加する場合は、それらをマージする必要があります。 – jny

関連する問題