Java 在某些请求期间省略了CXF AbstractOutDatabindingInterceptor标头
我目前正在编写一个RESTAPI,它使用CXF拦截器向每个请求添加特定的头 此拦截器的代码为:Java 在某些请求期间省略了CXF AbstractOutDatabindingInterceptor标头,java,rest,cxf,jax-rs,Java,Rest,Cxf,Jax Rs,我目前正在编写一个RESTAPI,它使用CXF拦截器向每个请求添加特定的头 此拦截器的代码为: public class TestHeaderInterceptor extends AbstractOutDatabindingInterceptor { public TestHeaderInterceptor() { super(Phase.SEND); } @SuppressWarnings("unchecked") @Override
public class TestHeaderInterceptor extends AbstractOutDatabindingInterceptor {
public TestHeaderInterceptor() {
super(Phase.SEND);
}
@SuppressWarnings("unchecked")
@Override
public void handleMessage(Message message) {
MultivaluedMap<String, Object> headers = (MetadataMap<String, Object>) message.get(Message.PROTOCOL_HEADERS);
if (headers == null) {
headers = new MetadataMap<String, Object>();
}
headers.add("X-Test", "test");
message.put(Message.PROTOCOL_HEADERS, headers);
}
}
我的REST API只有两个操作:
@GET
@Produces(JSON_UTF8)
@Path("test/{id}")
Test test(@PathParam("id") String id);
@POST
@Produces(JSON_UTF8)
@Path("test2/{type}")
@Consumes(JSON_UTF8)
Test test2(Test obj, @PathParam("type") Type type);
test/{id}
方法工作成功,并添加了头(使用Wireshark检查)。但是,test2/{type}
调用不会将头添加到请求中
最奇怪的是,在使用debug时,截取器代码被明显调用,这让我觉得apachecxf不知何故正在匹配我添加的头
这也是我使用
阶段.SEND
阶段而不是阶段.MARSHALL
的原因,因为我认为在运行所有这些阶段的过程中,我的头都会在某个地方被写入。但即使现在,标题仍然丢失。经过一些调试后,我发现在使用test2
调用时,CXF拦截器链是不同的,例如:
带测试的拦截器链:
带test2的拦截器链:
如您所见,在写入阶段有一个额外的BodyWriter
拦截器。我假设在编写请求主体时,您不能再访问头(因为主体位于头之后)
因此,修复方法是将TestHeaderInterceptor
移动到BodyWriter
之前的一个阶段,因此在我的代码中,我现在在构造函数中使用以下代码:
public TestHeaderInterceptor() {
super(Phase.SETUP);
}
[2014-06-13 10:49:48,535] - [DEBUG] - [Default Executor-thread-1] - [PhaseInterceptorChain.java:682] - Chain org.apache.cxf.phase.PhaseInterceptorChain@1384d8d1 was modified. Current flow:
pre-logical [ClientRequestFilterInterceptor]
prepare-send [MessageSenderInterceptor]
marshal [TestHeaderInterceptor]
prepare-send-ending [MessageSenderEndingInterceptor]
[2014-06-13 10:50:02,205] - [DEBUG] - [Default Executor-thread-1] - [PhaseInterceptorChain.java:682] - Chain org.apache.cxf.phase.PhaseInterceptorChain@69a33de5 was modified. Current flow:
pre-logical [ClientRequestFilterInterceptor]
prepare-send [MessageSenderInterceptor]
write [BodyWriter]
marshal [TestHeaderInterceptor]
prepare-send-ending [MessageSenderEndingInterceptor]
public TestHeaderInterceptor() {
super(Phase.SETUP);
}