在 HandlerInterceptor 获取 RequestBody 和 ResponseBody

新手上路,请多包涵

我必须实现的逻辑是记录所有请求,并将正文提供给数据库。

所以我决定使用: afterCompletion 方法 HandlerInterceptor 。有两个参数传递给此方法 HttpServletRequestHttpServletResponse 等等。

问题是:如何从提供的对象中获取 RequestBodyResponseBody

据我所知,在控制器我们可以使用 @RequestBody@ResponseBody 。我可以在 HandlerInterceptor 重新使用它们吗?

原文由 kyberorg 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.1k
2 个回答

据我所知, RequestBodyResponseBody 只能读取一次。所以你不应该在 Interceptor 中阅读它们。这里有一些 解释

原文由 marcellsimon 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以扩展 RequestBodyAdviceAdapter 并实现方法 afterBodyRead

 @ControllerAdvice
public MyRequestBodyAdviceAdapter extends RequestBodyAdviceAdapter {

    @Override
    public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter,
            Type targetType, Class<? extends HttpMessageConverter<?>> converterType) {

        // write body -your input dto- to logs or database or whatever

        return body;
    }

}

RequestBodyAdvice 在 HandlerInterceptor 之前预先设置请求链。正是在 http 请求输入流转换为您的对象之后。

原文由 Muhammad Hewedy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题