2012-04-04 5 views
6

Ich habe einen Interzeptor, der das Ergebnis der Spring MVC-Antworten protokolliert. Alle meine Antworten geben ResponseEntity-Objekte mit JSON-Body-Inhalten zurück.Feder Mvc Interceptor: Zugriff auf ResponseEntity in PostHandle

Ich möchte sowohl den Antworttext als auch den http-Status von der ResponseEntity abrufen.

Wie kann ich von den postHandle-Methodenattributen auf ResponseEntity zugreifen?

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

Das ModelAndView-Attribut ist null für meine Aufrufe.

Danke, Jason

Antwort

1

Ich habe eine volle Lösung, und eine Teillösung gefunden.

Teillösung: Für diejenigen, die Servlet 3.0 verwenden, ist der HTTPStatus-Code für das HttpServletResponse-Objekt verfügbar. Dies hätte die Hälfte meines Problems gelöst, indem ich den Statuscode bekommen konnte, aber es gab mir immer noch keinen Zugriff auf ResponseEntity mit dem Body-Attribut, das ich untersuchen wollte.

Volle Lösung (funktioniert auf Servlet 2.x): Ich verwendete eine Kombination aus einem Aspekt und einem Interceptor.

Der Aspekt wurde so codiert, dass er auf @AfterReturn der Methoden des Controllers abzielt, die ResponseEntities zurückgeben. Es erfasst im Wesentlichen die zurückgegebene responseEntity und fügt sie in eine ThreadLocal <ResponseEntity> Auflistung ein.

Der Interceptor fragte dann den Aspekt nach der Antwort des Threads und TA-DAH war zugänglich.

Ich hoffe, diese Antwort hilft jemand anderem. Prost, Jason

+0

Ich löste es mit diesem, Jason. [https://stackoverflow.com/questions/26756811/post-processing-of-a-json-response-in-spring-mvc] – Lucas

2

Bis Sie Ihre Frage geschrieben haben, denke ich, dass es nicht möglich war, aber jetzt ist es. Aus ihrer docs http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-intercepto

„Beachten Sie, dass die postHandle Methode der HandlerInterceptor nicht immer mit @ResponseBody und ResponseEntity Methoden. Ein HttpMessageConverter zu und schreibt die Antwort schreibt in solchen Fällen den Einsatz ideal geeignet ist, bevor postHandle genannt wird, die es unmöglich macht, ., um die Antwort zu ändern, zum Beispiel einen Header hinzufügen Stattdessen kann eine Anwendung ResponseBodyAdvice implementieren und entweder deklarieren es als @ControllerAdvice Bohne oder konfigurieren sie es direkt auf 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; 
    } 
} 

Quelle: Post processing of a Json response in spring MVC