2011-09-03 2 views
5

私はSpring HandlerInterceptorをアプリケーション(/ app/*)のフロントエンドURLを傍受しています。私は、HandlerInterceptor内でHandler内のどのアクションメソッドが呼び出されるかを判断したいと思います。それを見る方法はありますか?要求されたパスに基づいてそれを見ることができる何かをインターセプタに注入する必要がありますか?Spring HandlerInterceptorからHandlerで呼び出されているメソッドを検索するにはどうすればよいですか?

インターセプタは、このようなものです:

public class PageCacheInterceptor implements HandlerInterceptor {...} 

それは、次のようにマッピングされます。

<mvc:interceptors> 
    <bean class="com.example.web.interceptors.PageCacheInterceptor" /> 
</mvc:interceptors> 

背景(私はあなたが頼むよ知っているので!)。私は単純なページキャッシュをアプリケーションに追加しており、コントローラー内の適切なメソッドごとに@Cacheableのような注釈を使用したいと考えています。インターセプタは、それを作成したアクションに基づいてレスポンスをキャッシュするかどうかを決定できます。例えば

@RequestMapping(value = "", method = RequestMethod.GET) 
@Cacheable(events={Events.NEW_ORDER,Events.NEW_STAT}) 
public String home(Model model) {...} 

イベントは、キャッシュが無効化されるものです。たとえば、/ widget/listアクションの場合、保存されている新しいウィジェットによってキャッシュされたレスポンスが無効になります。

編集:最新のSpring 3.1 M2にアップグレードしました。私が必要とする機能を暗示したthis blog postですが、これらの新しいクラスを注入するかサブクラス化する必要があるかは不明です。インターセプタでHandlerMethodを取得するためにそれらを使用していますか?

+1

[OK]を役に立てば幸い:

次に、あなたはこの種のものを行うことができます。しかし、... 100人未満の評判を持つユーザーは、自分の質問に8時間答えることができません。だから、あなたが解決策を待っているあなたの席の端にいたら、きつく抱き締めてください... –

答えて

7

ソリューションは、実際には本当に簡単だったのでOK:

1)春にアップグレード3.1

2)RTFM(適切に)HandlerInterceptorはにObjectからハンドラをキャストすることができます例えば

HandlerMethodを呼び出して、ターゲットコントローラメソッド、その注釈などにアクセスする

3)ハンドルをキャストrインターセプタのHandlerMethodへのオブジェクト。 、

HandlerMethod method = (HandlerMethod) handler; 
    Cacheable methodAnnotation = method.getMethodAnnotation(Cacheable.class); 
    if (methodAnnotation != null) { 
     System.out.println("cacheable request"); 
    } 
0
@Override 
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
System.out.println("Pre-handle"); 
HandlerMethod hm=(HandlerMethod)handler; 
Method method=hm.getMethod(); if(method.getDeclaringClass().isAnnotationPresent(Controller.class)){ 
if(method.isAnnotationPresent(ApplicationAudit.class)) 
{ 
System.out.println(method.getAnnotation(ApplicationAudit.class).value()); 
request.setAttribute("STARTTIME",System.currentTimemillis()); 
} 
} 
return true; 
} 

この投稿は、より多くの詳細を持っている、これは私がこれを考え出しhttp://www.myjavarecipes.com/spring-profilingaudit-using-mvc-filters/