2009-09-08 73 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); 
相关问题