gpt4 book ai didi

java - 如何在CXF拦截器中获取HTTP响应代码?

转载 作者:太空宇宙 更新时间:2023-11-04 11:02:45 25 4
gpt4 key购买 nike

我有基于 Apache CXF 的 Web 服务。我编写了拦截器来记录一些包含 http 响应代码的特定内容。

public class MyOutInterceptor extends AbstractPhaseInterceptor<Message> {

public MyOutInterceptor() {
super(Phase.SEND);
}

@Override
public void handleMessage(Message message) throws Fault {
Integer responseCode = (Integer) message.get(Message.RESPONSE_CODE);
//...
}
}
但是!!! responseCodenull。即使我更改拦截器阶段,它也始终为 null
如何在CXF拦截器中获取http响应代码?

<小时/>

UPD。应用程序 Spring/CXF 配置:https://gist.github.com/alexiuscrow/b5ceb2df7d652a77cd788454e0792211

<小时/>

UPD。临时解决办法

@Override
public void handleMessage(Message message) throws Fault {
Integer responseCode = (Integer) message.get(Message.RESPONSE_CODE);
if (null == responseCode) {
HttpServletResponseWrapper responseWrapper =
(HttpServletResponseWrapper) message.get(AbstractHTTPDestination.HTTP_RESPONSE);
responseCode = responseWrapper.getStatus();
}
//...
}

最佳答案

确保您已注册 outinterceptor 的拦截器,而不是 outFaultInterceptor 或 FaultInterceptor 等。这是经过验证的示例。

import org.apache.cxf.annotations.Provider;
import org.apache.cxf.annotations.Provider.Type;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@Provider(value=Type.OutInterceptor)
public class KpOutInterceptor2 extends AbstractPhaseInterceptor<Message> {

private final static Logger LOG = LoggerFactory.getLogger(KpOutInterceptor2.class);

public KpOutInterceptor2() {
super(Phase.SEND);

}

@Override
public void handleMessage(Message message) throws Fault {
LOG.info("JAXRS response status code is {}", message.get(Message.RESPONSE_CODE));
}

}

或者更好的方法是使用 JAXRS 2.0 标准过滤器。

import java.io.IOException;

import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.ext.Provider;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
@Provider
public class KpOutInterceptor implements ContainerResponseFilter {

private final static Logger LOG = LoggerFactory.getLogger(KpOutInterceptor.class);

@Override
public void filter(ContainerRequestContext reqCtx, ContainerResponseContext resCtx) throws IOException {

LOG.info("JAXRS response status code is {}", resCtx.getStatus());

}

}

关于java - 如何在CXF拦截器中获取HTTP响应代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46716424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com