2010-07-23 28 views

Respuesta

78

Los beans de ámbito de solicitud se pueden autoconectar con el objeto de solicitud.

private @Autowired HttpServletRequest request; 
+2

¿Existe una forma XML a la antigua para esto? – cherouvim

+1

@cherouvim: No lo creo, no. El objeto de solicitud actual no está visible como referencia de bean. – skaffman

+0

bien, usaré la magia de autoenvío entonces. Gracias. – cherouvim

102

primavera expone la HttpServletRequest objeto actual (así como la corriente HttpSession objeto) a través de un objeto envoltura de tipo ServletRequestAttributes. Este objeto contenedor está vinculado a ThreadLocal y se obtiene llamando al método staticRequestContextHolder.currentRequestAttributes().

ServletRequestAttributes proporciona el método getRequest() para obtener la solicitud actual, getSession() para obtener la sesión actual y otros métodos para obtener los atributos almacenados en ambos ámbitos. El siguiente código, aunque un poco feo, que debe recibir la solicitud objeto actual en cualquier lugar de la aplicación:

HttpServletRequest curRequest = 
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()) 
.getRequest(); 

Tenga en cuenta que el método devuelve una interfaz RequestContextHolder.currentRequestAttributes() y necesita ser typecasted a ServletRequestAttributes que implementa la interfaz. Javadoc


primavera:RequestContextHolder | ServletRequestAttributes

+5

La inyección es una buena resolución, pero he encontrado problemas con las pruebas de MockMvc Validadores de primavera que inyectan HttpServletRequest. Entonces, si desea que las pruebas simuladas y el código de producción se ejecuten correctamente, esta debería ser la opción. – Neyko

+0

@Neyko ¿Por qué es? para prueba simulada (¿Prueba de unidad?), puede inyectar simulacro HttpServletRequest o lo que quiera ... ¿no es así? ¿O puedes usar MockHttpServletRequest, supongo? – wonhee

Cuestiones relacionadas