【问题标题】:Apache CXF (2.6.1): Client gets "Content is not allowed in prolog"Apache CXF (2.6.1):客户端得到“prolog 中不允许内容”
【发布时间】:2012-08-23 00:34:40
【问题描述】:

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

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

((BindingProvider)port).getRequestContext().put("mtom-enabled", Boolean.FALSE);
((BindingProvider)port).getRequestContext().put("write.attachments", Boolean.FALSE);
((BindingProvider)port).setMTOMEnabled(false);

请帮助我真的很想迁移到 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>

谢谢, 康斯坦丁

【问题讨论】:

    标签: web-services apache jaxb cxf xmlbeans


    【解决方案1】:

    没有 CXF 请求以 --uuid 正常启动。这是通过多部分 HTTP 消息的一部分。不管有没有 MTOM,一个普通的 SOAP 消息都由一个 HTTP 头和 XML 内容组成。如果是 MTOM,HTTP header 声明为 multipart,然后有 multipart 分隔符和 sub-headers。

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

    JAXB 通常仅在您有 @XmlMimeType("application/octet-stream") 注释时才启用 MTOM。您还应该查看服务的 WSDL/XSD,看看它是否有 xmime 注释。

    更多详情请见the CXF MTOM doc

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

    【讨论】:

    • 您好,感谢您的快速回复,我已经用您提到的信息(cxf 版本,客户端代码)更新了帖子。
    • 您确定这是网络上的所有数据,并且没有关于 -- 的标题吗?您是否在客户端打开了 CXF 日志拦截器?
    • 是的,这就是我拥有的所有代码。我检查了我的 wsdl 中的注释 - 没有找到。日志拦截器没有显示太多新内容(我不明白为什么它是多部分的):出站消息 ---------------------------- ID: 1 地址:api.someserver.com/wsadmin/v2/AdminWebService 编码:UTF-8 Content-Type:multipart/related;类型=“文本/xml”;边界="uuid:c0848dcb-39a2-4d0e-ba71-c28fa123895f";开始=""; start-info="text/xml" 标头:{Accept=[/], Authorization=[Basic a2JhYnVzaGtpbjpyb290MTIz], SOAPAction=[""]} ----------- --------------------------
    • 我猜这是 wsdl 中的东西,使它成为多部分:
    • 非常感谢您的努力,对不起,我将这个问题留给 Dan Kulp 回答(见下文)。
    【解决方案2】:

    Daniel Kulp 在 CXF 用户邮件列表中回答了该问题,详情请参阅 http://cxf.547215.n5.nabble.com/Apache-CXF-2-6-1-Client-gets-Content-is-not-allowed-in-prolog-td5713009.html#a5713055。简而言之,问题在于 WSDL(它包含 swaRefs),它强制 CXF 发送带有附件的消息。还提供了解决方法...

    【讨论】:

      猜你喜欢
      • 2017-06-13
      • 2011-06-01
      • 2011-07-23
      • 2016-09-06
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 2011-04-09
      • 1970-01-01
      相关资源
      最近更新 更多