【问题标题】:Getting JAX-WS to generate code with parameters that have namespaces?让 JAX-WS 生成带有名称空间参数的代码?
【发布时间】:2013-09-04 06:55:49
【问题描述】:

我有一个 WSDL,并且我已经获得了 wsimport 来为它生成好的代码。并且代码运行。而“hello”操作(不带参数)就可以了。

但现在我正在调用“CreateSomething”操作。我的服务器代码抱怨请求中没有发送任何参数。但是我在我的服务器代码中将其注销,我就在那里看到它......

<?xml version="1.0" encoding="UTF-8"?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:ABCDEFGRequest
      xmlns:ns2="http://ray.com:55555/cgi-bin/WebObjects/App.woa/wa/abcsoap">
      <AAA>999</AAA>
      <BBB>Dept 999</BBB>
      <CCC>Dept 999 password</CCC>
      <DDD>abcNextTest</DDD>
    </ns2:ABCDEFGRequest>
  </S:Body>
</S:Envelope>

嘿,我觉得这很好!最近怎么样?当我手动创建请求时,它会起作用。

那么问题来了

      <AAA>999</AAA>

应该是

      <ns2:AAA>999</ns2:AAA>

但我当然不是在创建请求。 JAX-WS 生成的代码是。那么,我如何告诉它参数也需要在命名空间中呢?这似乎有点基本。

包含此操作的 WSDL 切片如下。

<?xml version="1.0" encoding="utf-8" ?>
<wsdl:definitions
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:tns="http://__HOST__/cgi-bin/WebObjects/__APP__.woa/wa/abcsoap"
    targetNamespace="http://__HOST__/cgi-bin/WebObjects/__APP__.woa/wa/abcsoap">

    <wsdl:types>

        <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://__HOST__/cgi-bin/WebObjects/__APP__.woa/wa/abcsoap">

            <xsd:element name="ABCDEFGRequest"> 
                <xsd:complexType>
                    <xsd:all>

                        <xsd:element name="AAA">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:length value="3" />
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>

                        <xsd:element name="BBB">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:minLength value="1" />
                                    <xsd:maxLength value="40" />
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>

                        <xsd:element name="CCC">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:minLength value="1" />
                                    <xsd:maxLength value="40" />
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>

                        <xsd:element name="DDD">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:minLength value="1" />
                                    <xsd:maxLength value="8" />
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>

                    </xsd:all>
                </xsd:complexType>
            </xsd:element>

            <xsd:element name="ABCDEFGResponse">
                 <xsd:complexType>
                    <xsd:all>
                        <xsd:element name="AAA">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:length value="3" />
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>
                    </xsd:all>
                </xsd:complexType>
            </xsd:element>

        </xsd:schema>
    </wsdl:types>

    <wsdl:message name="ABCDEFGRequestMessage">
        <wsdl:part name="parameters" element="tns:ABCDEFGRequest"/>
    </wsdl:message>

    <wsdl:message name="ABCDEFGResponseMessage">
        <wsdl:part name="parameters" element="tns:ABCDEFGResponse"/>
    </wsdl:message>

    <wsdl:portType name="LMSPortType">
        <wsdl:operation name="ABCDEFG">
            <wsdl:input name="ABCDEFGRequestMessage" message="tns:ABCDEFGRequestMessage"/>
            <wsdl:output name="ABCDEFGResponseMessage" message="tns:ABCDEFGResponseMessage"/>
        </wsdl:operation>
    </wsdl:portType>

    <wsdl:binding name="LMSBinding" type="tns:LMSPortType">

        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>

        <wsdl:operation name="ABCDEFG">
            <soap:operation soapAction="ABCDEFG"/>
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>

    </wsdl:binding>

    <wsdl:service name="LMSService">

        <wsdl:port name="LMSPort" binding="tns:LMSBinding">
            <soap:address location="http://__HOST__/cgi-bin/WebObjects/__APP__.woa/wa/abcsoap"/>
        </wsdl:port>

    </wsdl:service>

</wsdl:definitions>

【问题讨论】:

    标签: java web-services wsdl jax-ws wsimport


    【解决方案1】:

    哇。 Apache 非常擅长发布大量文档。很多。所以,我在这里,眼睛流血,阅读了一堆 JAX-WS 字母汤,答案很简单。

    我通过查看 JAX-WS 的源代码发现了这一点。真的。在那里我发现:

    svn co http://svn.apache.org/repos/asf/axis/axis2/java/core/trunk/
    modules/samples/wsdl/perf.wsdl
    

    所以我发现我需要转到 WSDL 的顶部并进行更改:

        <xsd:schema
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             targetNamespace="http://__HOST__/cgi-bin/WebObjects/__APP__.woa/wa/abcsoap">
    

    到:

        <xsd:schema
             elementFormDefault="qualified"
             xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             targetNamespace="http://__HOST__/cgi-bin/WebObjects/__APP__.woa/wa/abcsoap">
    

    仅此而已。

    哇。鉴于这种行为,这可能是默认设置,是吗?哦,好吧。

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 2017-01-15
      • 2020-05-08
      • 1970-01-01
      • 2012-09-08
      • 2015-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多