在没有名称空间的SOAP请求在JAXB解组之后导致null

时间:2015-01-27 14:54:05

标签: xml web-services soap jaxb

我们必须从现有的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。除非我们真的需要,否则我们宁愿不这样做。

0 个答案:

没有答案