1

我在我的 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>

谢谢,康斯坦丁

4

2 回答 2

1

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

于 2012-08-23T20:26:26.877 回答
1

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

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

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

有关详细信息,请参阅CXF MTOM 文档

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

于 2012-08-23T00:50:17.083 回答