2009-06-10 8 views
8

He tratado de encontrar la respuesta a esta pregunta tanto en el foro de Spring como en la búsqueda de StackOverflow. He encontrado muchas páginas describiendo arquitecturas horribles y preguntando por la misma cosa que hago, pero el uso previsto es diferente, así que tengan paciencia conmigo :-)Accediendo a HttpServletRequest desde el consejo de AOP en Spring 2.5 con anotaciones

Tengo un proyecto de Spring 2.5 usando controladores de formulario basados ​​en anotaciones básicamente lo siguiente:

@RequestMapping("/edit/someObject") 
public String handleSubmit(HttpServletRequest request, HttpServletResponse response, SomeObject someObject, BindingResult result) { 

    // Some check here 

    if(result.hasErrors()) { 
     return "form"; 
    } else { 
     SomeObjectService.update(someObject); 
     return "redirect:/view/someObject"; 
    } 
} 

en este puedo comprobar si hay alguna propiedad http en el HttpServletRequest y uso el HttpServletResponse para enviar una redirección si esta propiedad tiene un cierto valor. Esta comprobación se realiza es una gran cantidad (pero no todos) de los controladores de formulario en esta aplicación. Lo que me gustaría hacer es crear una anotación @CheckedSubmit manejada por algunos consejos de AOP para hacer esta comprobación y luego soltar los parámetros HttpServletRequest y HttpServletResponse del controlador.

Mi problema es que no tengo idea de cómo acceder al HttpServletRequest y HttpServletResponse actual de este consejo AOP sin utilizar estos dos parámetros como (sin usar) para el método anotado, que es lo que traté de evitar en primer lugar.

Resumen: ¿Cómo acceder a HttpServletRequest/Response desde el consejo de AOP en un método anotado @RequestMapping?

Respuesta

12

Dos soluciones para el resumen, pero no para toda su problema (por completo)

Solución 1: en el interior consejo (> = Spring 2.0 requeridos)

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder 
     .getRequestAttributes()).getRequest(); 

Solución 2: dentro de la clase de aspecto (probablemente primavera 3.0 dentro de los frijoles singelton requeridos!)

@Autowired(required=true) 
private HttpServletRequest request; 
+0

Con la observación adicional de que la Solución 2 funciona para objetos no instanciados por Spring cuando se usa @Configurable (requiere AspectJ) – Tomas

3

Creo que probablemente ya lo sepas, pero el "oficial" fue hacer esto en Spring MVS es usar HandlerInterceptors. No están controlados por anotaciones, pero se insertan en el flujo de control de HTTP y obtienen acceso completo a la solicitud y respuesta.

+0

Sí, sé esto. Mi problema es que esto debe ser ligeramente configurable por método. Las anotaciones serían ideales para esto porque permiten una manera muy simple de manejar ese parámetro extra. – Tomas

+0

Sí, puedo ver que sería restrictivo. Otra opción podría ser escribir su propia implementación de HandlerAdapter, quizás subclasificando el AnnotationMethodHandlerAdapter. Nunca he hecho esto por mí mismo, pero puede darte la flexibilidad de hacer lo que necesites. – skaffman

Cuestiones relacionadas