2012-04-04 11 views
6

Possiedo un intercettore che registra l'esito delle risposte MVC di Spring. Tutte le mie risposte restituiscono oggetti ResponseEntity con contenuti del corpo JSON.interceptor mvc di primavera: accesso a ResponseEntity in postHandle

Vorrei prelevare sia il corpo della risposta sia lo stato http da ResponseEntity.

Come posso accedere a ResponseEntity dagli attributi del metodo postHandle?

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

L'attributo modelAndView è nullo per le mie chiamate.

Grazie, Jason

risposta

1

ho trovato una soluzione completa, e una soluzione parziale.

Soluzione parziale: Per quelli che utilizzano Servlet 3.0, il codice HTTPStatus è disponibile sull'oggetto HttpServletResponse. Questo avrebbe risolto metà del mio problema in quanto posso ottenere il codice di stato, ma non mi ha ancora dato accesso a ResponseEntity che ha l'attributo body che volevo controllare.

Soluzione completa (funziona su Servlet 2.x): Ho usato una combinazione di un Aspetto e un Interceptor.

L'aspetto è stato codificato per il target @AfterReturn dei metodi del controller che restituiscono ResponseEntities. Fondamentalmente ha catturato la risposta responseEntity e l'ha inserita in una raccolta ThreadLocal <ResponseEntity>.

L'Interceptor ha quindi chiesto all'Aspetto la risposta del thread e TA-DAH era accessibile.

Spero che questa risposta aiuti qualcun altro. Cheers, Jason

+0

L'ho risolto usando questo, Jason. [Https://stackoverflow.com/questions/26756811/post-processing-of-a-json-response-in-spring-mvc] – Lucas

2

Nel momento in cui hai scritto la tua domanda penso che non fosse possibile, ma ora lo è. Dalle loro documentazione http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-intercepto

"Si noti che il metodo di postHandle HandlerInterceptor non sempre è ideale per l'utilizzo con i metodi @ResponseBody e ResponseEntity. In questi casi un HttpMessageConverter scrive da e impegna la risposta prima postHandle è chiamata che rende impossibile . per modificare la risposta, ad esempio per aggiungere un'intestazione Invece un'applicazione può implementare ResponseBodyAdvice e sia dichiararla come un chicco di @ControllerAdvice o configurare direttamente sul 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; 
    } 
} 

Fonte: Post processing of a Json response in spring MVC