2012-04-04 17 views
6

Tengo un interceptor que registra el resultado de las respuestas Spring MVC. Todas mis respuestas devuelven objetos ResponseEntity que tienen contenido de cuerpo JSON.interceptor mvc de primavera: acceso a ResponseEntity en postHandle

Me gustaría obtener el cuerpo de la respuesta y el estado http de ResponseEntity.

¿Cómo puedo obtener acceso a ResponseEntity desde los atributos del método postHandle?

public void postHandle(HttpServletRequest request, 
    HttpServletResponse response, 
    Object handler, 
    ModelAndView modelAndView) {} 

El atributo modelAndView es nulo para mis invocaciones.

Gracias, Jason

Respuesta

1

Me han encontrado una solución completa, y una solución parcial.

Solución parcial: Para aquellos que usan Servlet 3.0, el código HTTPStatus está disponible en el objeto HttpServletResponse. Esto habría solucionado la mitad de mi problema, ya que puedo obtener el código de estado, pero aún así no me dio acceso a ResponseEntity, que tiene el atributo de cuerpo que quería inspeccionar.

Solución completa (funciona en Servlet 2.x): Utilicé una combinación de un Aspecto y un Interceptor.

El aspecto se codificó para apuntar al @AfterReturn de los métodos del controlador que devuelven ResponseEntities. Básicamente capturó la responseEntity devuelta y la colocó en una colección ThreadLocal <ResponseEntity>.

El Interceptor luego le pidió al Aspecto la respuesta del subproceso y TA-DAH fue accesible.

Espero que esta respuesta ayude a alguien más. Cheers, Jason

+0

Lo resolví usando esto, Jason. [https://stackoverflow.com/questions/26756811/post-processing-of-a-json-response-in-spring-mvc] – Lucas

2

En el momento en que escribiste tu pregunta, creo que no fue posible, pero ahora lo es. De sus documentos http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-intercepto

"Tenga en cuenta que el método de postHandle HandlerInterceptor no siempre es ideal para su uso con los métodos @ResponseBody y ResponseEntity. En tales casos, un HttpMessageConverter escribe y se compromete la respuesta antes de postHandle se llama lo que hace imposible . para cambiar la respuesta, por ejemplo, para agregar un encabezado en lugar de una aplicación puede implementar ResponseBodyAdvice y, o bien declarará como un bean @ControllerAdvice o configurarlo directamente en RequestMappingHandlerAdapter"

0
@ControllerAdvice 
public class ResponseDTOFilterAdvice implements ResponseBodyAdvice<Object> { 
    @Override 
    public boolean supports(final MethodParameter returnType, final Class<? extends HttpMessageConverter<?>> converterType) { 
     return true; 
    } 

    @Override 
    public Object beforeBodyWrite(final Object body, final MethodParameter returnType, final MediaType selectedContentType, 
     final Class<? extends HttpMessageConverter<?>> selectedConverterType, final ServerHttpRequest request, 
     final ServerHttpResponse response) { 
     if (body instanceof ResponseDTO<?>) { 
      ResponseDTO<?> responseDTO = (ResponseDTO<?>) body; 
      responseDTO.setHostname(request.getLocalAddress().getHostName()); 
     } 
     return body; 
    } 
} 

Fuente: Post processing of a Json response in spring MVC

Cuestiones relacionadas