2009-09-08 27 views
22

我正在開發一個使用WCF的可互操作的Web服務,我從Java客戶端使用它。當我創建代理類時,它會生成所有的getter和setter方法以及JAXBElement<String>字段。我搜索了這個JDK API中發現的構造:如何在Web Service中使用JAXBElement <String>?

JAXBElement(QName name, Class<T> declaredType, Class scope, T value) 

我應該如何使用這個構造?請解釋參數,並讓我知道是否在互聯網上有一個很好的教程來描述它的使用。

+0

你讀過Javadoc嗎? http://java.sun.com/javase/6/docs/api/javax/xml/bind/JAXBElement.html#JAXBElement%28javax.xml.namespace.QName,%20java.lang.Class,%20java.lang。類,%20T%29 – 2009-09-08 19:31:56

+1

不是答案,但是如果你的WCF DataMembers的IsRequired = true(不可能總是,但在大多數情況下應該可以接受),java開發人員會感謝你。那麼你不會得到JAXBEelement。還要考慮明確地使用設置順序。 – softveda 2010-07-08 13:46:59

回答

1

第一個參數名稱是您要鏡像的XML元素的限定名稱(本地名稱+名稱空間)。

declaredType是您綁定XML元素的類的類對象。

範圍是XML元素的使用範圍,但您可以將其設置爲null。

的declaredType類即結合到實際的XML元素實例實際的Java對象的實例。

0

那麼,用法..和例子。我想要它..

我找到了。所以你也許這樣做.. 它會工作。

Text t = new Text(); 
t.setValue("I need limo transportation"); 
JAXBElement<Text> text = new JAXBElement(SERVICE, Text.class, t); 
5

我偶然發現了這個問題,而我正在尋找相同的答案。我發佈了一個答案,但發現了一些問題。這是一種方法:

new javax.xml.bind.JAXBElement(
     new javax.xml.namespace.QName("http://locationOfURI", "nameOfElement"), 
     javax.xml.bind.JAXBElement.class, 
     null, what your object's value is); 

最後的意思是JAXBElement的類型參數。

希望這個工程。

13

只是爲了防止有人在這裏尋找解決方案:而不是使用JAXBElement,只能通過在綁定文件中將generateElementProperty設置爲false來使用Type。

在我的情況下我使用maven從wsdl生成存根文件。

部分POM文件和綁定文件(在此配置被稱爲javabindings.xml)

<plugin> 
     <groupId>org.apache.cxf</groupId> 
     <artifactId>cxf-codegen-plugin</artifactId> 
     <version>2.2.9</version> 
     <executions> 
     <execution> 
      <id>generate-sources</id> 
      <phase>generate-sources</phase> 
      <configuration> 
      <sourceRoot>${project.build.directory}/wsdl2java/generated-sources/src/main/java</sourceRoot> 
      <wsdlOptions> 
       <wsdlOption> 
        <wsdl>${basedir}/src/main/resources/yourWsdlFileOrURL.wsdl</wsdl> 

        <extraargs> 
         <extraarg>-verbose</extraarg> 
         <extraarg>-b</extraarg> 
         <extraarg>${basedir}/src/main/resources/javabindings.xml</extraarg> 
        </extraargs>       
       </wsdlOption> 
      </wsdlOptions> 

      </configuration> 
      <goals> 
       <goal>wsdl2java</goal> 
      </goals> 
     </execution> 
     </executions> 
    </plugin> 
<jaxb:bindings version="2.0" 
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<jaxb:bindings schemaLocation="http://localhost:15002/MiddlewareDataServiceConversion?xsd=xsd0"> 
    <jaxb:bindings node="/xs:schema"> 
     <jaxb:globalBindings generateElementProperty="false"/> 
    </jaxb:bindings> 
</jaxb:bindings> 

+0

非常感謝你 – skioppetto 2016-02-15 11:21:44

24

一個解決這個問題,你不需要創建一個單獨的用於創建JAXBElement的構造函數。尊重的元素可以從objectFactory.create........()方法中檢索。假設你想創建和設置響應對象的一些值,參數是爲JAXBElement型的,那麼你需要做的是這樣的:

someResponseObj.setMyValue(objectFactory.create.......()); 
/*method name that will be return a JAXBElement in setter()*/ 

注:請檢查ObjectFactory參考,因爲可以有多個ObjectFactory生成的代碼中的類,因此您需要引用與該包的類關聯的確切類。

0

嘗試在您的wsdl中使用minOccurs =「1」而不是minOccurs =「0」。出於某些(良好)原因,代碼生成器需要此信息才能將參數轉換爲基本的Java類型參數。

+0

minOccurs =「1」是默認的 – tamilnad 2011-09-23 06:02:02

+0

它對我有效,因爲我有minOccurs =「0」,但如果你已經有了......我不知道。 – 2011-10-28 13:25:06

11

我只是做同樣的事情,使用Java客戶端來comsume WCF web服務。我使用jaxws maven插件來生成客戶端代碼。

<plugin> 
    <groupId>org.codehaus.mojo</groupId> 
    <artifactId>jaxws-maven-plugin</artifactId> 
    <configuration> 
     <packageName>com.package1</packageName> 
     <sourceDestDir>src/main/java</sourceDestDir> 
     <wsdlDirectory>src/main/resources</wsdlDirectory> 
     <wsdlFiles> 
      <wsdlFile>wcf_webservice.wsdl</wsdlFile> 
     </wsdlFiles> 
    </configuration> 
</plugin> 

你應該有一個ObjectFactory類的com.package1,你可以用它來創建你的JAXBElements你,例如:

ObjectFactory factory = new ObjectFactory(); 
MyObject myObject = new MyObject(); 
JAXBElement<MyObject> elem = factory.createMyObject(myObject); 

正如一個側面說明,你需要拼合WCF WSDL在jaxws可以使用它之前。

0

我按照文檔試圖使用JAXBElement的上述方法時遇到了問題,而我發現這個方法對我來說非常合適。

 import javax.xml.bind.*; 

     JAXBContext jc = JAXBContext.newInstance(YOURCLASS.class); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(yourInstantiatedClass, System.out); 
相關問題