2012-04-04 4 views
6

У меня есть перехватчик, который регистрирует результат ответов Spring MVC. Все мои ответы возвращают объекты ResponseEntity с содержимым тела JSON.spring mvc interceptor: доступ к ResponseEntity в postHandle

Я хотел бы захватить как тело ответа, так и статус http из ResponseEntity.

Как я могу получить доступ к ResponseEntity из атрибутов метода postHandle?

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

Атрибут modelAndView имеет значение null для моих вызовов.

Спасибо, Джейсон

ответ

1

Я нашел одно полное решение и одно частное решение.

Частичное решение: Для тех, кто использует сервлет 3.0, код HTTPStatus доступен в объекте HttpServletResponse. Это решило бы половину моей проблемы в том, что я могу получить код состояния, но он все равно не дал мне доступ к ResponseEntity, у которого есть атрибут body, который я хотел проверить.

Полное решение (работает на сервлете 2.x): Я использовал комбинацию Aspect и Interceptor.

Аспект был закодирован для нацеливания на @AfterReturn методов контроллера, возвращающих ResponseEntities. Он в основном захватил возвращаемый объект responseEntity и поместил его в коллекцию ResponseEntityThreadLocal >.

Затем перехватчик запросил Аспект для ответа потока и TA-DAH, он был доступен.

Я надеюсь, что этот ответ поможет кому-то еще. Cheers, Jason

+0

Я решил это с помощью этого, Джейсон. [Https://stackoverflow.com/questions/26756811/post-processing-of-a-json-response-in-spring-mvc] – Lucas

2

К тому времени, как вы написали свой вопрос, я думаю, что это было невозможно, но теперь оно есть. Из них документов http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-intercepto

«Обратите внимание, что метод postHandle из HandlerInterceptor не всегда идеально подходит для использования с @ResponseBody и ResponseEntity методами. В таких случаях HttpMessageConverter пишет и совершает ответ, прежде чем postHandle называется, что делает его невозможным ., чтобы изменить ответ, например, чтобы добавить заголовок Вместо приложение может реализовать ResponseBodyAdvice и либо объявить его как @ControllerAdvice боба или настроить его непосредственно на 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; 
    } 
} 

Источник: Post processing of a Json response in spring MVC

Смежные вопросы