2011-09-03 15 views
5

Ho un Spring HandlerInterceptor che intercetta gli URL di frontend nella mia applicazione (/ app/*). Voglio determinare quale metodo di azione nel gestore sta per essere invocato dall'interno di HandlerInterceptor. C'è un modo per verificarlo, devo iniettare qualcosa nell'intercettore che può apparire in base al percorso richiesto?Come posso cercare il metodo chiamato su un Handler da Spring HandlerInterceptor?

Interceptor è come questo:

public class PageCacheInterceptor implements HandlerInterceptor {...} 

è mappato in questo modo:

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

Sfondo (perché so che ti chiedo!). Sto aggiungendo la semplice memorizzazione nella cache della pagina alla mia app e voglio usare un'annotazione come @Cacheable su ciascun metodo adatto nel controller. L'intercettore può quindi determinare se memorizzare una risposta in cache in base all'azione che l'ha creata.

Ad esempio:

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

Gli eventi sono quelli che causano la cache per essere invalidato. Ad esempio/widget/lista azione avrebbe la sua risposta memorizzata nella cache invalidata da un nuovo widget che viene salvato.

Modifica: ho eseguito l'aggiornamento a Spring 3.1 M2, come this blog post accennato alle funzionalità di cui ho bisogno, ma non è chiaro se sarà necessario iniettare queste nuove classi o sottoclassarle. Qualcuno li ha usati per recuperare il metodo Handler in un intercettore?

+1

Ok ho capito questo. Tuttavia ... "Gli utenti con meno di 100 reputazione non possono rispondere alla propria domanda per 8 ore" - quindi se sei sul bordo del tuo sedile in attesa della soluzione, tieni duro ... –

risposta

7

Ok, quindi la soluzione era in realtà molto semplice:

1) Aggiornamento a Spring 3,1

2) RTFM (correttamente)

Per esempio, un HandlerInterceptor può lanciare il gestore da Object a HandlerMethod e accedere al metodo del controllore di destinazione, alle sue annotazioni, ecc.

3) Lanciare la maniglia r oggetto a HandlerMethod in Interceptor.

Poi si può fare questo genere di cose:

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; 
} 

Questo post ha più dettagli, spero che questo aiuta http://www.myjavarecipes.com/spring-profilingaudit-using-mvc-filters/

Problemi correlati