我在我的 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>
谢谢,康斯坦丁