Web services ApacheCXF(2.6.1):客户端获得;prolog中不允许包含内容;

Web services ApacheCXF(2.6.1):客户端获得;prolog中不允许包含内容;,web-services,apache,jaxb,cxf,xmlbeans,Web Services,Apache,Jaxb,Cxf,Xmlbeans,我在java应用程序中使用ApacheCXF(2.6.1)来使用第三方Web服务。但我有一个问题,特别是如果我在生成存根时使用JAXB进行数据绑定,我的客户机将始终发送带有“头”的请求,如uuid:e47f145b-38f7-4402-8eec-657d71bc8ad4…(请参见下面的客户机请求),即除了XML部分外,还有一些特殊信息 看起来这个特殊信息会导致服务器回复错误“prolog中不允许内容”(请参阅下面的服务器响应),即服务器不需要这样的主体。这里有趣的是,如果我使用XMLBEANS生

我在java应用程序中使用ApacheCXF(2.6.1)来使用第三方Web服务。但我有一个问题,特别是如果我在生成存根时使用JAXB进行数据绑定,我的客户机将始终发送带有“头”的请求,如uuid:e47f145b-38f7-4402-8eec-657d71bc8ad4…(请参见下面的客户机请求),即除了XML部分外,还有一些特殊信息

看起来这个特殊信息会导致服务器回复错误“prolog中不允许内容”(请参阅下面的服务器响应),即服务器不需要这样的主体。这里有趣的是,如果我使用XMLBEANS生成存根来进行数据绑定,那么一切都开始正常工作(请求体中没有这样的“特殊”信息,只有XML)。在谷歌搜索之后,我怀疑我的客户出于某种原因试图使用MTOM(与JAXB一起),我不知道如何关闭它。我已经尝试了以下方法来关闭MTOM(运气不佳):

请帮忙,我真的很想转到JAXB,因为它比XMLBEANS更紧凑

客户端代码:

AdminServiceV2 ws = new AdminServiceV2();
AdminV2 port = ws.getAdminPortV2();

Client client = ClientProxy.getClient(port);
HTTPConduit http = (HTTPConduit) client.getConduit();

AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();
authorizationPolicy.setUserName("user1");
authorizationPolicy.setPassword("password1");
authorizationPolicy.setAuthorizationType("Basic");
http.setAuthorization(authorizationPolicy); 

try {
    port.getUsersInfo("user1");
} catch (Exception e) {
    e.printStackTrace();
}
--uuid:e47f145b-38f7-4402-8eec-657d71bc8ad4
Content-Type: text/xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getUsersInfo xmlns:ns2="http://service.admin.ws.five9.com/v2/"><userNamePattern>user1</userNamePattern></ns2:getUsersInfo></soap:Body></soap:Envelope>
--uuid:e47f145b-38f7-4402-8eec-657d71bc8ad4--
<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'><env:Header></env:Header><env:Body><env:Fault xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'><faultcode>env:Client</faultcode><faultstring>org.xml.sax.SAXParseException: Content is not allowed in prolog.</faultstring></env:Fault></env:Body></env:Envelope>
客户端请求:

AdminServiceV2 ws = new AdminServiceV2();
AdminV2 port = ws.getAdminPortV2();

Client client = ClientProxy.getClient(port);
HTTPConduit http = (HTTPConduit) client.getConduit();

AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();
authorizationPolicy.setUserName("user1");
authorizationPolicy.setPassword("password1");
authorizationPolicy.setAuthorizationType("Basic");
http.setAuthorization(authorizationPolicy); 

try {
    port.getUsersInfo("user1");
} catch (Exception e) {
    e.printStackTrace();
}
--uuid:e47f145b-38f7-4402-8eec-657d71bc8ad4
Content-Type: text/xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getUsersInfo xmlns:ns2="http://service.admin.ws.five9.com/v2/"><userNamePattern>user1</userNamePattern></ns2:getUsersInfo></soap:Body></soap:Envelope>
--uuid:e47f145b-38f7-4402-8eec-657d71bc8ad4--
<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'><env:Header></env:Header><env:Body><env:Fault xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'><faultcode>env:Client</faultcode><faultstring>org.xml.sax.SAXParseException: Content is not allowed in prolog.</faultstring></env:Fault></env:Body></env:Envelope>
——uuid:e47f145b-38f7-4402-8eec-657d71bc8ad4
内容类型:text/xml;字符集=UTF-8;type=“text/xml”;
内容传输编码:二进制
内容ID:
用户1
--uuid:e47f145b-38f7-4402-8eec-657d71bc8ad4--
服务器响应:

AdminServiceV2 ws = new AdminServiceV2();
AdminV2 port = ws.getAdminPortV2();

Client client = ClientProxy.getClient(port);
HTTPConduit http = (HTTPConduit) client.getConduit();

AuthorizationPolicy authorizationPolicy = new AuthorizationPolicy();
authorizationPolicy.setUserName("user1");
authorizationPolicy.setPassword("password1");
authorizationPolicy.setAuthorizationType("Basic");
http.setAuthorization(authorizationPolicy); 

try {
    port.getUsersInfo("user1");
} catch (Exception e) {
    e.printStackTrace();
}
--uuid:e47f145b-38f7-4402-8eec-657d71bc8ad4
Content-Type: text/xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:getUsersInfo xmlns:ns2="http://service.admin.ws.five9.com/v2/"><userNamePattern>user1</userNamePattern></ns2:getUsersInfo></soap:Body></soap:Envelope>
--uuid:e47f145b-38f7-4402-8eec-657d71bc8ad4--
<env:Envelope xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'><env:Header></env:Header><env:Body><env:Fault xmlns:env='http://schemas.xmlsoap.org/soap/envelope/'><faultcode>env:Client</faultcode><faultstring>org.xml.sax.SAXParseException: Content is not allowed in prolog.</faultstring></env:Fault></env:Body></env:Envelope>
env:Clientorg.xml.sax.SAXParseException:prolog中不允许包含内容。
谢谢,
Konstantin

任何CXF请求都不会以--uuid正常启动。这是通过多部分HTTP消息实现的。无论是否使用MTOM,普通SOAP消息都由HTTP头和XML内容组成。如果是MTOM,HTTP头声明为multipart,然后有multipart分隔符和子头

如果您使用自定义前端来请求没有通常所需HTTP头的“纯XML”消息,那么,与MTOM结合使用,可能会产生不良影响

JAXB通常仅在您有
@xmlmetype(“应用程序/八位字节流”)
注释时才启用MTOM。您还应该查看服务的WSDL/XSD,并查看其中是否有xmime注释

有关更多详细信息,请参阅


您尚未指定CXF版本或配置CXF客户端端点的方式。通过将所有数据发送到CXF用户邮件列表,您可能会得到更好的帮助。

丹尼尔·库普在CXF用户邮件列表中回答了这个问题,有关详细信息,请参阅
. 简言之,问题在于WSDL(它包含swaRefs)强制CXF发送带有附件的消息。还提供了解决方法…

您好,感谢您的快速回复,我已经用您提到的信息(cxf版本,客户端代码)更新了帖子。您真的确定这是所有在线数据,并且没有关于--?的标题吗?您在客户端打开了CXF日志拦截器了吗?是的,这就是我所有的代码。我已经检查了wsdl中的注释-没有找到任何注释。日志拦截器并没有显示太多新内容(我不明白为什么它是多部分的):出站消息-----------------ID:1地址:编码:UTF-8内容类型:多部分/相关;type=“text/xml”;边界=“uuid:c0848dcb-39a2-4d0e-ba71-c28fa123895f”;start=“”;start info=“text/xml”标题:{Accept=[/],Authorization=[Basic a2JhYnVzaGtpbjpyb290MTIz],SOAPAction=[”“]}--------------------我想这是wsdl中使其成为多部分的原因:非常感谢您的努力,很抱歉,我将这个问题留给Dan Kulp回答(见下文)。