2009-09-08 10 views
22

Sto sviluppando un servizio Web interoperabile utilizzando WCF che sto consumando da un client Java. Quando ho creato la classe proxy, ho generato tutti i metodi getter e setter e un campo JAXBElement<String>. Ho cercato questo nell'API JDK e trovato il costruttore:Come utilizzare JAXBElement <String> nel servizio Web?

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

Come dovrei usare questo costruttore? Si prega di spiegare i parametri e fammi sapere se c'è un buon tutorial su Internet che ne descrive l'uso.

+0

Hai letto il Javadoc? http://java.sun.com/javase/6/docs/api/javax/xml/bind/JAXBElement.html#JAXBElement%28javax.xml.namespace.QName,%20java.lang.Class,%20java.lang. Classe,% 20T% 29 –

+1

Non una risposta, ma gli sviluppatori java ti ringrazieranno se i tuoi DataFile WCF hanno IsRequired = true (non possibile sempre ma nella maggior parte dei casi dovrebbe essere accettabile). Quindi non avrai il JAXBEelement. Considera inoltre l'utilizzo dell'impostazione dell'Ordine in modo esplicito. – softveda

risposta

1

Il primo parametro nome è un nome qualificato (nome locale + spazio nome) dell'elemento XML di cui si sta eseguendo il mirroring.

dichiaratoTipo è l'oggetto di classe della classe a cui si sta vincolando il proprio elemento XML.

scope è l'ambito di utilizzo dell'elemento XML, ma è possibile impostarlo su null.

valore è un'istanza di declaredType classe cioè l'oggetto Java effettivo legato alla effettiva istanza elemento XML.

0

Quindi dov'è l'utilizzo .. e l'esempio. Lo voglio ..

L'ho trovato. Quindi potresti farlo ... Funzionerà.

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

Mi sono imbattuto in questa domanda mentre cercavo la stessa risposta. Ho postato una risposta ma ho trovato alcuni problemi. Ecco un modo per farlo:

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); 

L'ultimo significa che il parametro di tipo di JAXBElement.

Spero che questo funzioni.

13

Nel caso in cui qualcuno finisca qui cercando una soluzione: invece di usare JAXBElement si può usare solo il Type impostando la proprietà generateElementProperty su false in un file di binding.

Nel mio caso Im utilizzando Maven per generare i file stub da wsdl.

file di pom parziale e file di binding (in questo config è chiamato 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

grazie mille – skioppetto

24

Una soluzione a questo problema è, non è necessario creare un separato costruttore per creare un JAXBElement. L'elemento rispettato può essere recuperato dal metodo objectFactory.create........().Supponiamo di voler creare e impostare un certo valore in oggetto risposta, e l'argomento è come di JAXBElement tipo, allora avete bisogno di fare in questo modo:

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

Nota: Si prega di controllare il riferimento ObjectFactory perché non ci può essere molteplici ObjectFactory classi nel codice generato, quindi è necessario fare riferimento all'esatto che è associato alla classe di quel pacchetto.

0

Prova a utilizzare minOccurs = "1" anziché minOccurs = "0" nel tuo wsdl. Per qualche (buon) motivo, il generatore di codice ha bisogno di queste informazioni per convertire parametri in parametri di tipo java di base.

+0

minOccurs = "1" è di default – tamilnad

+0

Beh, ha funzionato per me perché avevo minOccurs = "0" ma se hai già quello ... Non lo so. –

11

Sto facendo esattamente la stessa cosa, utilizzando un client Java per registrare il servizio Web WCF. Sto usando il plugin maven di jaxws per generare il codice lato client.

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

si dovrebbe avere una classe ObjectFactory nel vostro com.package1 che può essere utilizzato per creare i JAXBElements per voi ad esempio:

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

Proprio come una nota a margine, è necessario appiattire il WSDL WCF prima che jaxws possa usarlo.

0

Ho avuto problemi a provare i metodi sopra usando JAXBElement come da documentazione e ho trovato questo, invece, che ha funzionato perfettamente per me.

 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); 
Problemi correlati