Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用拦截器记录REST服务,但可以';t日志请求和响应_Java_Spring_Logging_Interceptor - Fatal编程技术网

Java 使用拦截器记录REST服务,但可以';t日志请求和响应

Java 使用拦截器记录REST服务,但可以';t日志请求和响应,java,spring,logging,interceptor,Java,Spring,Logging,Interceptor,我有一些REST服务,我想记录请求和响应。它们接收一个JSON请求并生成另一个JSON响应。我已经创建了一个拦截器,但无法获取请求/响应正文。这是我的cxf配置: <bean id="ContextInInterceptor" class="main.interceptors.ContextMessageInInterceptor"></bean> <bean id="ContextOutInterceptor" class="main.interceptors.C

我有一些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扩展了AbstractPhaseInterceptor{
@自动连线
ContextJSONInInterceptor ContextJSONInInterceptor;
public ContextMessageInInterceptor(){
超级(阶段前调用);
}
@凌驾
公共无效handleMessage(消息消息){
contextJSONInInterceptor.handleMessage(message);
}
}
公共类ContextJSONInInterceptor扩展了AbstractPhaseInterceptor{
公共上下文JSONiNinInterceptor(){
超级(阶段前调用);
}
@凌驾
public void handleMessage(消息消息消息)引发错误{
System.out.println(“内容类型:”+message.get(message.Content_-Type));
System.out.println(message.toString());
System.out.println(“--------------”;
}
}
公共类ContextMessageOutInterceptor扩展了AbstractPhaseInterceptor{
@自动连线
ContextJSONOutInterceptor ContextJSONOutInterceptor;
public contextmessageoutiterceptor(){
超级(相位写入);
}
@凌驾
public void handleMessage(消息消息消息)引发错误{
handleMessage(消息);
}
}
公共类ContextJSonOutinetCeptor扩展了AbstractPhaseInterceptor{
public ContextJSONOutInterceptor(){
超级(相位写入);
}
@凌驾
public void handleMessage(消息消息消息)引发错误{
System.out.println(“内容类型:“+消息内容类型”);
System.out.println(message.toString());
System.out.println(“--------------”;
}
}
ContextMessageInInterceptor和ContextMessageOutInterceptor工作正常,它们分别进入ContextJSONInInterceptor和ContextJSONOutInterceptor,但我不知道如何从这些拦截器获取请求/响应主体。我已经尝试使用“Message”常量,而内容类型就是我得到的全部

有人知道如何从那些拦截器获取请求/响应主体吗


非常感谢您的时间。

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

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

您有两种选择:通过查看请求和方法,通过一些反思,您可以获得一些信息,这些信息可能就是您所需要的一切

public class ApiInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    // code
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//code
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
   // code
    }
}

第二种选择是(可以是互补的)。您可以使用指向所有
@RequestMapping()
注释的切入点,以及在您想要的时候执行的建议。不久前我就开始谈论这件事。

太好了,但是,为什么这么有趣呢?因为我从来没有做过这样的事情,而且我觉得很有趣