2016-05-20 10 views
1

起動時に@RequestMappingの値を変更することはできますか?起動時に@RequestMappingsを変更する

基本的には、@Api(Api.Version.V1)の注釈を作成してください。これは、リクエストマッピングを/api/dogsから/api/v1/dogsに変更する必要があることを意味します。クラスレベル(すべてに適用)とメソッドレベル(以前のバージョンからコントローラを再利用し、変更する)の両方でこれを実行したいと思います。

これをハードコードすることはできますが、これでは多くの文字列が処理されてしまいます。

起動時にリクエストのマッピングを変更することは可能ですか(bppなどを使用して)豆が作成された後、私はそれらを変更したくない/変更する必要はありません。

私はRequestConditionも調べていますが、これはより動的な性質を持っているようですが、この場合は助けになるとは思いません。

もう1つの問題は、同じリクエストマッピングで2つのクラスに注釈を付けることができることです(注釈を書き直すことができます)。これは初期コンテキストの読み込み時に行う必要があると確信しています重複したマッピングなどを取得しません)。

正しい方向のポインタがあれば幸いです。

編集:

はほとんど働いてこれを手に入れた、私はカスタムRequestMappingHandlerMappingを使用して、私は注釈(タイプとメソッドの両方で)を取得して修正RequestMappingInfoを返すことができます方法getMappingForMethodをオーバーライドしていますパスが追加されました。

古いマッピングをすべて削除しても、/api/v1/dogsだけを戻しても、/api/dogsへの古いマッピングは引き続き機能しますが、1つの問題が残ります。何とかこのマッピングを削除することもできますか?

誰かが興味がある場合、コードはここにあります。

@Component 
public class CustomRequestMappingHandlerMapping 
    extends RequestMappingHandlerMapping 
{ 
    @Override 
    protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) 
    { 
     RequestMappingInfo info = super.getMappingForMethod(method, handlerType); 

     ApiVersion methodApiVersion = AnnotationUtils.findAnnotation(method, ApiVersion.class); 
     ApiVersion typeApiVersion = AnnotationUtils.findAnnotation(handlerType, ApiVersion.class); 

     if (typeApiVersion == null) 
     { 
      return info; 
     } 

     Set<String> oldPatterns = info.getPatternsCondition().getPatterns(); 
     Set<String> patterns = new HashSet<>(); 

     for (String p : oldPatterns) 
     { 
      for (int v = 0; v < typeApiVersion.value().length; v++) 
      { 
       ApiVersion.Version version = typeApiVersion.value()[v]; 

       if (!p.startsWith(version.getValue())) 
       { 
        if (p.startsWith("/")) patterns.add("/" + version.getValue() + p); 
        else patterns.add("/" + version.getValue() + "/" + p); 
       } 
       else 
       { 
        patterns.add(p); 
       } 
      } 
     } 

     PatternsRequestCondition patternsRequestCondition = new PatternsRequestCondition(
      patterns.toArray(new String[]{}), null, null, true, true, null); 

     RequestMappingInfo mappingInfo = new RequestMappingInfo(
      null, patternsRequestCondition, info.getMethodsCondition(), info.getParamsCondition(), info.getHeadersCondition(), info.getConsumesCondition(), 
      info.getProducesCondition(), info.getCustomCondition() 
     ); 

     return mappingInfo; 
    } 
} 
+0

としてデフォルトの実装を使用しての独自のカスタムハンドラーマッピングを作成することですそれで紛争があった。 – mortenoh

答えて

1

あなたは動的にHandlerMappingインタフェースを実装するか、AbstractUrlHandlerMappingを拡張することにより、いずれかrequestMappingsを追加することができます。 `また、デフォルトを登録する` RequestMappingHandlerMapping:

アイデアは、代わりに私が `<注釈駆動型/ MVC>を使用していた問題は、そのことをしたななどSimpleUrlHandlerMapping,DefaultAnnotationHandlerMapping