我们必须从现有的WSDL逆向工程SOAP端点。现有客户端无法更改,WSDL也无法更改。使用JAXB和wsdl2java我们创建了我们的java类 - 我们目前没有XJB配置。然后,当使用SOAPUI生成的客户端测试生成的SOAP端点时,一切正常。但是,当我们发送现有的客户端SOAP请求时,“web”namespaced-fields在生成的Java对象中映射为null。
调查显示,SOAPUI生成的工作请求在请求的复杂元素中具有命名空间信息。例如。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:web="http://com/myco/myapp/webservice/">
<soapenv:Header/>
<soapenv:Body>
<web:create>
<web:CreateRequest>
<TransactionID>ABABABABAB</TransactionID>
<Carrier>XX</Carrier>
<web:DispenseDetails>
<ServiceName>235495484</ServiceName>
<ServiceOption>Packet</ServiceOption>
</web:DispenseDetails>
</web:CreateRequest>
</web:create>
</soapenv:Body>
</soapenv:Envelope>
虽然命名空间是在create element中定义的,但现有的请求却没有:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header/>
<soapenv:Body>
<create xmlns="http://com/myco/myapp/webservice/">
<CreateRequest>
<TransactionID>ABABABABAB</TransactionID>
<Carrier>XX</Carrier>
<DispenseDetails>
<ServiceName>235495484</ServiceName>
<ServiceOption>Packet</ServiceOption>
</DispenceDetails>
</CreateRequest>
</create>
</soapenv:Body>
</soapenv:Envelope>
当我们手动将“myco”命名空间信息添加到现有请求时(即我们将其更新为上面的工作,删除创建中的xmlns并添加web ns声明和标记前缀等),然后这些根据需要通过对象,一切正常。在标签级别(例如)的此信息中执行相同操作似乎不会像我们预期的那样级联到子元素。
注意:WSDL确实有一个目标命名空间:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/"
xmlns:y="http://com/myco/myapp/webservice/"
xmlns:ns="http://com/myco/myapp/webservice/envelope"
<types>
<xs:schema
targetNamespace="http://com/myco/myapp/webservice/
...
我们猜测我们可能会在生成类时使用一些XJB配置来提供更多信息,从而使解组弹簧成功投入生命,但一直无法找到要添加的特定调整。 (我们只有一个WSDL,没有额外的XSD。)
最后,我们的计划B是使用XSL转换预处理请求以添加命名空间信息,但这似乎有点像躲避。最后,为了完成图片,我们在CXF SOAP端点后面使用Camel路由 - 因此我们想要在解组之前回退到XSL。除非我们真的需要,否则我们宁愿不这样做。