2012-08-12 17 views
5

"/ api"というマッピングを持つ親コントローラクラスを定義し、そのコントローラを別の実装で拡張したいと考えています。 のでApiControllerがあります。たとえばSpringコントローラを実装するときに共通の親パスを共有する

@Controller 
@RequestMapping("/api") 

を、私のユーザコントローラは、ベースのAPIコントローラを拡張する必要がありますし、また、それは、「/ API /ユーザ」のリクエストにお答えしますので、パスを「/ユーザ」を追加します。だからUserControllerは:

@Controller 
@RequestMapping("/users") 

を持ちますが、それはApiControllerを拡張しているので、/ api/usersに効果的に答えます。

もちろん、すべてのコントローラに「/ api」を追加して親クラスなしでも実現できますが、可能であれば「正しい方法」にすることをお勧めします。よりきれいで目に見えるパス。

私はApiControllerベースクラスを拡張しようとしましたが、これはうまくいかず、UserControllerはまだ "/ users"に答え、ベースクラス "/ api"を無視します。

答えて

3

Hmmm。あなたはこれを試すことができ、それは私のためにどのような作品です:

@RequestMapping("/abstract") 
public abstract class AbstractController { 


} 

@Controller 
public class ExtendedAbstractController extends AbstractController { 

    @RequestMapping("/another") 
    public String anotherTest() { 
     return "another"; 
    } 

} 

注意、あなたのベースクラスには@Controller注釈を持っていてはいけないと抽象でなければなりません。

コントローラーとしてアノテートされた抽象クラスではなく、@RequestMappingのものを拡張しようとすると、RequestMappingHandlerMappingの初期化時にエラーが発生します。

+1

こんにちは、申し訳ありませんが、私は何とかあなたの答えを忘れてしまったに違いありません。残念ながら、実装クラスにも独自の「ベース」マッピングを持たせたいので、ExtendedAbstractControllerに@RequestMapping( "/ another")アノテーションを付けて、すべてのメソッドにこのプレフィックスが付くようにしてください。あなたのソリューションでは、RequestMappingアノテーションを持つメソッドだけがアノテーションを拡張します。 – TheZuck

+1

@TheZuckええ、私はあなたが必要なものではないと私が知っていることを知っている。 :[ちょうどあなたを助けようとしていました::)春はあなたが望むように注釈の継承をサポートしていません... Btwあなたは春のJIRAに行き、あなたの提案で同じことに投票したり、新しい問題を作成したりすることができます。 ;) – masted

0

あなたはでそれを達成することができます:

  1. 同じパス接頭辞
  2. とコントローラ用のサブコンテキストのコンフィギュレーションを作成して、特定のパスにthis answer

ルックをマッピングされた独自のDispatcherServletとサブコンテキストを作成。似たような問題ですが、@RestControllersです。