java - 使用拦截器记录REST服务但无法记录请求和响应

标签 java spring logging interceptor

我有一些 REST 服务,我想记录请求和响应。它们接收 JSON 请求并生成另一个 JSON 响应。我已经创建了一个拦截器,但无法获取请求/响应正文。这是我的 cxf 配置:

<bean id="ContextInInterceptor" class="main.interceptors.ContextMessageInInterceptor"></bean>
<bean id="ContextOutInterceptor" class="main.interceptors.ContextMessageOutInterceptor"></bean>
<bean id="ContextJSONInInterceptor" class="main.interceptors.ContextJSONInInterceptor"></bean>
<bean id="ContextJSONOutInterceptor" class="main.interceptors.ContextJSONOutInterceptor"></bean>

<cxf:bus>
   <cxf:features>
      <cxf:logging/>
   </cxf:features>

   <cxf:inInterceptors>
      <ref bean="ContextInInterceptor"/>
   </cxf:inInterceptors>
   <cxf:outInterceptors>
      <ref bean="ContextOutInterceptor"/>
   </cxf:outInterceptors>
</cxf:bus>

这是我的拦截器代码:

public class ContextMessageInInterceptor extends AbstractPhaseInterceptor<org.apache.cxf.message.Message> {

       @Autowired
       ContextJSONInInterceptor contextJSONInInterceptor;

       public ContextMessageInInterceptor() {
           super(Phase.PRE_INVOKE);
       }

       @Override
       public void handleMessage(Message message) {
           contextJSONInInterceptor.handleMessage(message);
       }
}

public class ContextJSONInInterceptor extends AbstractPhaseInterceptor<Message> {

    public ContextJSONInInterceptor() {
        super(Phase.PRE_INVOKE);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        System.out.println("Content-Type: " + message.get(Message.CONTENT_TYPE));
        System.out.println(message.toString());
        System.out.println("---------------");
    }
}

public class ContextMessageOutInterceptor extends AbstractPhaseInterceptor<Message> {

    @Autowired
    ContextJSONOutInterceptor contextJSONOutInterceptor;

    public ContextMessageOutInterceptor() {
        super(Phase.WRITE);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        contextJSONOutInterceptor.handleMessage(message);
    }
}

public class ContextJSONOutInterceptor extends AbstractPhaseInterceptor<Message> {

    public ContextJSONOutInterceptor() {
        super(Phase.WRITE);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        System.out.println("Content-Type: " + Message.CONTENT_TYPE);
        System.out.println(message.toString());
        System.out.println("---------------");
    }

}

ContextMessageInInterceptor 和 ContextMessageOutInterceptor 工作正常,它们分别转到 ContextJSONInInterceptor 和 ContextJSONOutInterceptor,但我不知道如何从这些拦截器获取请求/响应正文。我尝试使用“Message”常量,但内容类型就是我得到的全部。

有人知道如何从这些拦截器中获取请求/响应正文吗?

非常感谢您的宝贵时间。

最佳答案

与拦截器相比,AOP 是一个不错的选择。您可以将其应用于请求/响应流量通过的 Controller 方法。为了在该请求范围内获取请求对象,您可以执行以下操作:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
            .getRequest();

关于java - 使用拦截器记录REST服务但无法记录请求和响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50364524/

相关文章:

java - Spring 验证 : Multiple DTOs vs single DTO with multiple validators

python - 队列消费者打印与日志记录

angularjs - 在运行时获取模块和 Controller |服务|指令名称

Python:使用时间戳记录操作和异常

java - 如何在用 Java 编写的 AWS Lambda 中处理 SNS 消息?

java - angularjs 中是否有任何插件,例如当 session 输出用户应要求登录凭据时

java - Spring Oauth2 JDBC客户端配置多次添加相同的客户端

Android Spring 和 SSL 的 java.lang.StackOverflowError

java - 导入 google-play-service 依赖红十字

java - 不同时区的MySql应用给出不同的结果