2009-07-28 18 views
2

springを使用するDefaultAnnotationHandlerMapping特定のURLを最終的に処理するコントローラを検索する方法を教えてください。指定されたURL(春)のコントローラを決定する方法

私は現在、これを持っていますが、要求のマッピングの100Sを反復処理よりもきれいな方法があるようにあるべきように感じている:

public static Object getControllerForAction(String actionURL) { 
    ApplicationContext context = getApplicationContext(); 
    AnnotationHandlerMapping mapping = (AnnotationHandlerMapping) context.getBean("annotationMapper"); 
    PathMatcher pathMatcher = mapping.getPathMatcher(); 
    for (Object key: mapping.getHandlerMap().keySet()) { 
     if (pathMatcher.match((String) key, actionURL)){ 
      return mapping.getHandlerMap().get(key); 
     } 
    } 
    return null; 
} 
+0

なぜこれを見つける必要があるのでしょうか? –

+0

URL文字列を取り込むjspタグがあり、マップされたコントローラのカスタム注釈に基づいてタグ結果を表示するか非表示にしたいですか? –

答えて

2

この質問のために、DefaultAnnotationHandlerMappingの興味深いメソッドとそのスーパークラスはすべて保護されており、外部コードからは見えません。ただし、DefaultAnnotationHandlerMappingというカスタムサブクラスを作成すると、これらのメソッドをオーバーライドしてpublicにするのは簡単です。

リクエストオブジェクトではなくパスを提供できる必要があるため、lookupHandlerAbstractUrlHandlerMappingがこれに適していると思います。リクエストオブジェクトとパスを提供する必要がありますが、そのリクエストオブジェクトはvalidateHandler()メソッドに渡すためにのみ使用されます。これは何もしません。

+0

サブクラスは必要ありません。私が答えて言ったように、getHandler()はHandlerMappingインターフェースで宣言されているので公開されています。それは 'HandlerExecutionChain'を返しますが、unwrapするのは簡単です。 – ChssPly76

+0

OPが指摘したように、getHandler()は彼のニーズには役に立たない。私は収容するために私の答えを変更しました。 – skaffman

+0

公平を期すために、彼は両方の答えの後でそれを指摘しました:-)いずれにしても、validateHandler()は 'DefaultAnnotationHandlerMapping'でオーバーライドされ、nullとして渡すリクエストは非常に多く使われているためオプションではありません。 – ChssPly76

1

すべてのマッパーはgetHandler()メソッドを持っているHandlerMappingインタフェースを実装:

ApplicationContext context = getApplicationContext(); 
AnnotationHandlerMapping mapping = (AnnotationHandlerMapping) context.getBean("annotationMapper"); 
Object controller = mapping.getHandler().getHandler(); 

HandlerMapping.getHandler()HandlerExecutionChainを返す場合は、getHandler()を呼び出すと、実際のハンドラが返されます。コントローラマッパの場合は、探しているコントローラです ために。

+1

HandlerMapping.getHandler(javax.servlet.http.HttpServletRequest httpServletRequest)の問題はリクエストを受け取り、URLのリクエストが(jspタグ内で)作成される前に状況を処理する必要があることです。 –

+0

あなたはあなたの質問でそれを言っていませんでしたが、十分に公正です。その場合、私はあなたの今のところに行くか、以下の** skaffman **の提案を見てください。しかし、NULL要求オブジェクトの可能性のある問題を認識してください。 – ChssPly76

1

上記はSpring 3.1では機能しません。代わりに次の操作を行うことができます。

Map<String, AbstractHandlerMethodMapping> map = WebApplicationContextUtils.getWebApplicationContext(servletContext).getBeansOfType(AbstractHandlerMethodMapping.class); 
Iterator<AbstractHandlerMethodMapping> iter = map.values().iterator(); 
while (iter.hasNext()) { 
    AbstractHandlerMethodMapping ahmb = iter.next(); 
    Iterator<Object> urls = ahmb.getHandlerMethods().keySet().iterator(); 
    while (urls.hasNext()) { 
     Object url = urls.next(); 
     logger.error("URL mapped: " + url); 
    }   
} 
関連する問題