起動時に@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;
}
}
としてデフォルトの実装を使用しての独自のカスタムハンドラーマッピングを作成することですそれで紛争があった。 – mortenoh