4

我有一个来自 Axis2 Web 服务的 WSDL 文件。当我使用wsimport给定的 WSDL 文件生成客户端存根时,生成的类需要JAXBElement参数。为什么会这样?

来自生成的类之一的示例方法:

JAXBElement<DataBean> value;

public void setValue(JAXBElement<DataBean> value)
{
    this.value = ((JAXBElement<DataBean>) value);
}

我希望它看起来像这样(没有 JAXBElement):

DataBean value;

public void setValue(DataBean value)
{
    this.value= (DataBean) value;
}

我在网上看到的教程并没有将类设置为 JAXBElement。可能是什么问题呢?请注意,服务器是一个 Axis2 Web 服务,WSDL 文件是由 Axis2 自动生成的。假设是我无法控制服务器。

如何以wsimport不会将参数转换为 JAXBElements 的方式制作它?

以下是 WSDL 文件的摘录:(我忽略了一些标签以仅包含基本标签)

<xs:element name="getData">
    <xs:complexType>
        <xs:sequence>
            <xs:element minOccurs="0" name="getData" nillable="true" type="ax220:getData"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

<xs:complexType name="getData">
    <xs:sequence>
        <xs:element minOccurs="0" name="value" nillable="true" type="ax219:DataBean"/>
    </xs:sequence>
</xs:complexType>

<wsdl:message name="getDataRequest">
    <wsdl:part name="parameters" element="ns:getData"/>
</wsdl:message>

<wsdl:message name="getDataResponse">
    <wsdl:part name="parameters" element="ns:getDataResponse"/>
</wsdl:message>

<wsdl:operation name="getData">
    <wsdl:input message="ns:getDataRequest" wsaw:Action="urn:getData"/>
    <wsdl:output message="ns:getDataResponse" wsaw:Action="urn:getDataResponse"/>
</wsdl:operation>

<wsdl:operation name="getData">
    <soap:operation soapAction="urn:getData" style="document"/>
    <wsdl:input>
        <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output>
        <soap:body use="literal"/>
    </wsdl:output>
</wsdl:operation>

<wsdl:operation name="getData">
    <soap12:operation soapAction="urn:getData" style="document"/>
    <wsdl:input>
        <soap12:body use="literal"/>
    </wsdl:input>
    <wsdl:output>
        <soap12:body use="literal"/>
    </wsdl:output>
</wsdl:operation>

<wsdl:operation name="getData">
    <http:operation location="getData"/>
    <wsdl:input>
        <mime:content type="text/xml" part="parameters"/>
    </wsdl:input>
    <wsdl:output>
        <mime:content type="text/xml" part="parameters"/>
    </wsdl:output>
</wsdl:operation>
4

2 回答 2

6

如本页所述:

http://www.techdevtips.com/java/java-webservice-client-how-to-remove-jaxbelement

使用此代码的数据绑定文件:

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings
  xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"
  xmlns:xjc= "http://java.sun.com/xml/ns/jaxb/xjc" jaxb:extensionBindingPrefixes="xjc">
  <jaxb:globalBindings generateElementProperty="false">
    <xjc:simple />
  </jaxb:globalBindings>
</jaxb:bindings>

并通过填充绑定属性(或 -b 标志参数,如果您使用可运行对象)在您的 wsimport ant 任务中使用它

干杯:)

于 2014-05-27T16:03:13.460 回答
2

首先:我不认为这是可以做到的。也就是说,我认为您不能告诉 wsimport 以不同的方式生成类。但是,我可以告诉您如何修改 WSDL,从而以不同的方式生成模式并且仍然可以让您与服务对话。

我从 WSDL 中获取了类型定义,调整了 complexType 的名称并添加了上面缺少的 DataBean 类型。我将它粘贴到一个模式并使用 xjc(JAXB 模式编译器)编译模式,wsimport 使用它从类型定义生成类。这是架构:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/DataBean"
    xmlns:tns="http://www.example.org/DataBean" elementFormDefault="qualified"
    xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:element name="getData">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" name="getDataType" type="tns:getDataType" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>

    <xs:complexType name="getDataType">
        <xs:sequence>
            <xs:element minOccurs="0" name="value" type="tns:DataBean" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="DataBean">
        <xs:simpleContent>
            <xs:extension base="xs:int" />
        </xs:simpleContent>
    </xs:complexType>
</schema>

您不需要编译器的任何特殊选项,只需执行 xjc 并将其指向模式文件,然后它将编译源文件。

生成的类不用JAXBElement作方法参数。那就是它们看起来像这样:

protected DataBean value;

public DataBean getValue() {
    return value;
}

为什么是这样?我nillable="true"从元素定义中删除了属性,这就成功了。nillable="true"声明显式空值在这里是合法的:

<DataBean></DataBean> 

如果您删除此属性,如果服务实际上在其中写入空值,您的代码将遇到问题。但在生成了所有 WSDL 之后,也许 Axis2 只是认为 nillable 出于某种原因应该在其中,尽管实现从未真正使用它。如果幸运的话,虽然您修改了 WSDL,但它不会,并且一切都会正常工作。

我希望这有帮助!如果没有,那么至少我今天学到了一些东西;-)

于 2012-08-31T11:01:24.230 回答