2011-09-03 11 views
5

Tengo un Spring HandlerInterceptor que intercepta las URL de la interfaz en mi aplicación (/ app/*). Quiero determinar qué método de acción en el controlador va a invocarse desde HandlerInterceptor. ¿Hay alguna manera de buscar eso? ¿Necesito inyectar algo en el interceptor que pueda buscarlo en función de la ruta solicitada?¿Cómo puedo buscar el método que se llama en un controlador desde un manipulador de primavera?

El Interceptor es así:

public class PageCacheInterceptor implements HandlerInterceptor {...} 

se asigna así:

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

de fondo (porque sé que va a pedir!). Estoy agregando el almacenamiento en caché de página simple a mi aplicación y quiero utilizar una anotación como @Cacheable en cada método adecuado en el controlador. El interceptor puede determinar si almacenar en caché una respuesta en función de la acción que la creó.

Por ejemplo:

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

Los eventos son los que hacen que el caché de ser invalidado. Por ejemplo, la acción widget/list tendría su respuesta en caché invalidada por un nuevo widget que se guarda.

Editar: Me actualicé a la versión más reciente de Spring 3.1 M2, como this blog post insinuó las características que necesito, pero no está claro si será necesario inyectar estas nuevas clases o subclasificarlas. ¿Alguien los ha usado para recuperar el HandlerMethod en un interceptor?

+1

autorización I cuenta de esto. Sin embargo ... 'Los usuarios con menos de 100 reputaciones no pueden responder su propia pregunta durante 8 horas', así que si estás en el borde de tu asiento esperando la solución, agárrate bien ... –

Respuesta

7

Ok por lo que la solución era realmente muy fácil:

1) Cambio a la primavera 3,1

2) RTFM (correctamente)

Por ejemplo, un HandlerInterceptor puede emitir el manejador del objeto a HandlerMethod y obtenga acceso al método del controlador de destino, sus anotaciones, etc.

3) Eche el asa objetar a HandlerMethod en el Interceptor.

A continuación, puede hacer este tipo de cosas:

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

Este post tiene más detalles, espero que esto ayuda a http://www.myjavarecipes.com/spring-profilingaudit-using-mvc-filters/

Cuestiones relacionadas