2009-09-08 14 views
22

Bir Java istemcisinden aldığım WCF'yi kullanarak birlikte çalışabilir bir web hizmeti geliştiriyorum. Proxy sınıfını oluşturduğumda, tüm alıcı ve ayarlayıcı yöntemleri ile JAXBElement<String> alanını oluşturdu. Bunun için JDK API'sinde arama yaptım ve kurucuyu buldum:Web hizmetinde JAXBElement <String> nasıl kullanılır?

Bu kurucuyu nasıl kullanmalıyım? Lütfen parametreleri açıklayın ve internette kullanımını açıklayan iyi bir öğretici varsa bana bildirin.

+0

Javadoc'u okudunuz mu? http://java.sun.com/javase/6/docs/api/javax/xml/bind/JAXBElement.html#JAXBElement%28javax.xml.namespace.QName,%20java.lang.Class,%20java.lang. Sınıf,% 20T% 29 –

+1

Bir cevap değil, ancak java geliştiricileri WCF DataMembers isRequired = true (eğer mümkün değil ama çoğu durumda kabul edilebilir olmalıdır) size teşekkür edecektir. O zaman JAXBEelement'i alamazsın. Siparişi açıkça belirterek kullanmayı da düşünün. – softveda

cevap

1

adı adının ilk parametresi, yansıtmakta olduğunuz XML öğesinin nitelikli adıdır (yerel ad + ad alanı).

deckeedType, XML öğenizi bağladığınız sınıfın sınıf nesnesidir.

Kapsam XML Öğesinin kullanım kapsamıdır, ancak boş olarak ayarlayabilirsiniz.

değeri yani gerçek XML eleman örneğine bağlı gerçek bir Java nesnesine declaredType sınıfının bir örneğidir.

0

Kullanım nerede ve örnek. Onu istiyorum ..

Ben onu buldum. Yani bunu yapabilirsin .. Çalışacak.

5

Aynı cevabı ararken bu soruya tökezledim. Bir cevap yazdım ama birkaç sorunla karşılaştım.

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

son JAXBElement tipi parametresini şu anlama gelir: Burada bunu yapmak için bir yoldur.

Bu çalışma umarım.

13

Birisi burada bir çözüm ararken biterse: JAXBElement kullanmak yerine, bir bağlama dosyasında false yapmak için generateElementProperty öğesini ayarlayarak yalnızca Tür'ü kullanabilirsiniz.

Benim durumumda wsdl dosyasından stub dosyalarını oluşturmak için maven kullanıyorum.

kısmi pom dosya ve bağlamaları dosyası (bu config denir 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

çok teşekkür ederim – skioppetto

24

Sorun bu bir çözüm, ister ayrı oluşturmak gerekmez JAXBElement oluşturmak için kurucu. Saygın eleman objectFactory.create........() yönteminden alınabilir.

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

Not: Birden fazla olabilir çünküObjectFactory referansı kontrol edin Eğer yanıt nesnesine bazı değer yaratmak ve ayarlamak istediğiniz varsayalım ve argüman JAXBElement Çeşidi gibidir, o zaman bu şekilde yapmak gerekiyor Oluşturulan koddaki ObjectFactory sınıfları, böylece o paketin sınıfıyla ilişkili olanı tam olarak göndermeniz gerekir.

0

wOdl'nuzda minOccurs = "0" yerine minOccurs = "1" kullanmayı deneyin. Bazı (iyi) nedenlerden dolayı, kod jeneratörü parametreleri temel java tipi parametrelerine dönüştürmek için bu bilgiye ihtiyaç duyar.

+0

minOccurs = "1" varsayılan olarak – tamilnad

+0

Peki benim için çalıştı çünkü minOccurs = "0" vardı ama eğer zaten varsa ... Ben bilmiyorum. –

11

Sadece WCF web hizmetini tüketmek için bir Java İstemcisi kullanarak aynı şeyi yapıyorum. İstemci tarafı kodunu oluşturmak için jaxws maven eklentisini kullanıyorum.

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

Sadece bir yan not olarak, sen wcf wsdl düzleştirmek gerekir:

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

Sen örneğin için size JAXBElements oluşturmak için kullanabileceğiniz hangi com.package1 bir ObjectFactory sınıf olması gerekir jaxws kullanmadan önce.

0

JAXBElement belgesini kullanarak yukarıdaki yöntemleri denemede sorunlar yaşadım ve bunun yerine benim için mükemmel bir iş çıkardım.

 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); 
İlgili konular