перехватчик spring mvc: доступ к ResponseEntity в postHandle

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

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

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

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

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

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


person jason    schedule 04.04.2012    source источник


Ответы (3)


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

«Обратите внимание, что метод postHandle HandlerInterceptor не всегда идеально подходит для использования с методами @ResponseBody и ResponseEntity. В таких случаях HttpMessageConverter записывает и фиксирует ответ до вызова postHandle, что делает невозможным изменение ответа, например, добавление заголовок. Вместо этого приложение может реализовать ResponseBodyAdvice и либо объявить его как bean-компонент @ControllerAdvice, либо настроить его непосредственно в RequestMappingHandlerAdapter"

person Jordi Llach    schedule 20.07.2016

@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;
    }
}

Источник: Постобработка ответа Json в Spring MVC

person Lucas    schedule 24.05.2017

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

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

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

Аспект был закодирован так, чтобы нацеливаться на @AfterReturn методов контроллера, которые возвращают ResponseEntities. По сути, он перехватил возвращенный responseEntity и поместил его в коллекцию ThreadLocal‹ResponseEntity›.

Затем Перехватчик запросил у Аспекта ответ потока, и ТА-ДАХ он был доступен.

Я надеюсь, что этот ответ поможет кому-то еще. Привет, Джейсон

person jason    schedule 19.04.2012
comment
Я решил это, используя это, Джейсон. [stackoverflow.com/questions/26756811/ - person Lucas; 24.05.2017