Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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 在某些请求期间省略了CXF AbstractOutDatabindingInterceptor标头_Java_Rest_Cxf_Jax Rs - Fatal编程技术网

Java 在某些请求期间省略了CXF AbstractOutDatabindingInterceptor标头

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

我目前正在编写一个RESTAPI,它使用CXF拦截器向每个请求添加特定的头

此拦截器的代码为:

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);
}