[英]How to get HTTP RESPONSE CODE in CXF interceptor?
I have web service based on Apache CXF. 我有基于Apache CXF的Web服务。 I wrote interceptor for logging some specific stuff that's included http response code.
我编写了拦截器,用于记录一些包含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);
//...
}
}
BUT!!! 但!!!
responseCode
is null
. responseCode
为null
。 Even if I change the interceptor phase, it's always null
. 即使更改了拦截器阶段,它也始终为
null
。
How can I get http response code in CXF interceptor? 如何在CXF拦截器中获取http响应代码?
UPD . UPD 。 Application Spring/CXF configuration: https://gist.github.com/alexiuscrow/b5ceb2df7d652a77cd788454e0792211
应用程序Spring / CXF配置: https : //gist.github.com/alexiuscrow/b5ceb2df7d652a77cd788454e0792211
UPD . UPD 。 Temporary solution
临时解决方案
@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();
}
//...
}
Make sure you've registered the interceptor for outinterceptor
not for outFaultInterceptor or FaultInterceptor
etc. Here is validated example. 确保已将拦截器注册为
outinterceptor
而不是outFaultInterceptor or 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));
}
}
Or much better way use JAXRS 2.0 standard Filters. 或更好的方式使用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());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.