Apache CXF JAX-RS服务缺少XML文档启动

时间:2011-10-19 13:57:21

标签: jax-ws document cxf jax-rs

我正在使用Apache CXF和Spring开发Web服务。我的接口和配置已配置,以便我同时拥有REST和SOAP服务。 Apache CXF没有开始使用XML文档:<?xml version="1.0" encoding="UTF-8"?>

对于SOAP服务,我实现了一个拦截器,它完美地运行。这是代码:

public class CustomHeaderInterceptor extends AbstractPhaseInterceptor<Message> {

public CustomHeaderInterceptor() {
    super(Phase.PRE_STREAM);
    addBefore(StaxOutInterceptor.class.getName());
}

@Override
public void handleMessage(Message message) throws Fault {
    message.put(Message.ENCODING, "UTF-8");
    message.put(StaxOutInterceptor.FORCE_START_DOCUMENT, Boolean.TRUE);
}
}

使用以下配置添加拦截器:

<bean id="customHeader" class="com.minervanetworks.xtv.stb.utils.CustomHeaderInterceptor" />

<cxf:bus>
    <cxf:inInterceptors>
        <ref bean="logInbound" />
    </cxf:inInterceptors>
    <cxf:outInterceptors>
        <ref bean="customHeader" />
        <ref bean="logOutbound" />
    </cxf:outInterceptors>
    <cxf:inFaultInterceptors>
        <ref bean="logInbound" />
    </cxf:inFaultInterceptors>
    <cxf:outFaultInterceptors>
        <ref bean="logOutbound" />
    </cxf:outFaultInterceptors>
</cxf:bus>

不幸的是,这对我的JAX-RS服务器不起作用。 “StaxOutInterceptor.FORCE_START_DOCUMENT”由StaxOutInterceptor处理,当我使用JAX-RS时它不在链中。它无法手动添加,因为它依赖于StaxOutEndingInterceptor,它处于*结束阶段并在JAXRSOutInterceptor之后调用。

我也试过为同样的目的实现处理程序但没有任何成功。

这是我的JAXRS服务器配置:

<jaxrs:server id="restServer" address="/rest">
    <jaxrs:providers>
        <ref bean="systemExceptionMapper" />
        <ref bean="jaxbProvider" />
    </jaxrs:providers>
    <jaxrs:serviceBeans>
        ...
    </jaxrs:serviceBeans>
    <jaxrs:extensionMappings>
        <entry key="json" value="application/json" />
        <entry key="xml" value="application/xml" />
        <entry key="feed" value="application/atom+xml" />
        <entry key="html" value="text/html" />
    </jaxrs:extensionMappings>
</jaxrs:server>

任何形式的帮助 - 想法,建议,以及任何有用的东西!

1 个答案:

答案 0 :(得分:3)

经过大量时间投入这个问题后,我找到了以下解决方案。

Apache CXF在编组集合时没有放入XML Document Start,这就是我的情况。它是JAXBElement提供程序中的一种遗漏。我意识到编组单个物体时一切都很好。

所以对我来说明显的解决方案是将我的集合包装在一个集合对象中,如下所示:

  

公共类CollectionWrapper {

     

私人清单收藏;

     

...

     

}

重构我的方法以返回CollectionWrapper,而不是List完成了这项工作。