我有一个拦截器记录了Spring MVC响应的结果。我的所有响应都返回具有JSON正文内容的ResponseEntity对象。
我想从ResponseEntity中获取响应正文和http状态。
如何从postHandle方法属性访问ResponseEntity?
public void postHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler,
ModelAndView modelAndView) {}
对于我的调用,modelAndView属性为null。
谢谢, 杰森
答案 0 :(得分:3)
当你写下你的问题时,我认为这是不可能的,但现在却是。 来自他们的文档http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-intercepto
“请注意,HandlerInterceptor的postHandle方法并不总是非常适合与@ResponseBody和ResponseEntity方法一起使用。在这种情况下,HttpMessageConverter在调用postHandle之前写入并提交响应,这使得无法更改响应,添加标头的示例。相反,应用程序可以实现ResponseBodyAdvice并将其声明为@ControllerAdvice bean或直接在RequestMappingHandlerAdapter上配置它“
答案 1 :(得分:2)
我找到了一个完整的解决方案和一个部分解决方案。
部分解决方案: 对于那些使用Servlet 3.0的用户,HttpServletResponse对象上提供了HTTPStatus代码。这可以解决我的一半问题,因为我可以获取状态代码,但它仍然没有让我访问具有我想要检查的body属性的ResponseEntity。
完整解决方案(适用于Servlet 2.x): 我使用了Aspect和拦截器的组合。
Aspect被编码为针对返回ResponseEntities的控制器方法的@AfterReturn。它基本上捕获了返回的responseEntity并将其放在ThreadLocal< ResponseEntity>中。采集。
然后,拦截器向Aspect询问线程的响应和TA-DAH是否可访问。我希望这个答案有助于其他人。 干杯, 杰森
答案 2 :(得分:2)
@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;
}
}