2012-08-31 59 views
4

我有一個來自Axis2 Web服務的WSDL文件。在給定WSDL文件的情況下使用wsimport生成客戶端存根時,生成的類需要JAXBElement參數。這是爲什麼?從生成的類之一爲什麼通過wsimport生成的類需要JAXBElement <ClassName>參數?

抽樣方法:

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> 
+0

您可以發佈WSDL的哪些部分是DataBean在消息和操作中定義和使用的嗎? – joergl

+0

@joergl:我修改了我的帖子以包含所需的詳細信息。 – Arci

回答

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只是認爲應該在那裏出於某種原因,儘管實現從未真正使用它。如果你幸運的話,它不會,一切都會正常工作,儘管你修改了WSDL。

我希望這有助於!如果沒有,那麼至少我今天學到;-)

+0

嗨!謝謝!會試試這個。 :)希望它的作品。我會及時通知你的。所以基本上,您是說Axis2不符合JAXWS標準,因此,如果不手動修改WSDL,wsimport無法生成由Axis2生成的WSDL?我對你有正確的理解嗎? – Arci

+0

謝謝!刪除nillable屬性的竅門! – Arci

+0

好吧,沒有。 Axis2至少在很大程度上符合JAX-WS標準。我沒有對它進行詳細的測試,但是我確定它實現了大多數的部分並且沒有實現一些;-)這裏的問題相當於JAXB模式生成的一些邊緣情況。我應該修正根目錄(通過更改註釋以不生成nillable = true的Web服務)。由於你無法做到這一點,本地工作是最好的,你可以得到。 – joergl

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任務中使用它

乾杯:)

相關問題