如何在Web服务中使用JAXBElement ?

我正在使用WCF开发一个可互操作的Web服务,我正在从Java客户端使用它。 当我创建代理类时,它生成了所有getter和setter方法以及JAXBElement字段。 我在JDK API中搜索了这个并找到了构造函数:

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

我该如何使用这个构造函数? 请解释这些参数,如果互联网上有一个描述其用途的好教程,请告诉我。

解决这个问题的方法是,您不需要创建单独的构造函数来创建JAXBElement 。 可以从objectFactory.create........()方法中检索受尊重的元素。 假设您要在响应对象中创建和设置一些值,并且参数是JAXBElement类型,那么您需要这样做:

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

注意:请检查ObjectFactory引用,因为生成的代码中可能有多个ObjectFactory类,因此您需要引用与该类的类关联的确切类。

以防有人在此处寻找解决方案:通过在绑定文件中将generateElementProperty设置为false,可以仅使用Type,而不是使用JAXBElement。

在我的情况下,我使用maven从wsdl生成存根文件。

部分pom文件和绑定文件(在此配置中称为javabindings.xml)

   org.apache.cxf cxf-codegen-plugin 2.2.9   generate-sources generate-sources  ${project.build.directory}/wsdl2java/generated-sources/src/main/java   ${basedir}/src/main/resources/yourWsdlFileOrURL.wsdl  -verbose -b ${basedir}/src/main/resources/javabindings.xml      wsdl2java     
       

我只是在做同样的事情,使用Java客户端来共享WCF Web服务。 我正在使用jaxws maven插件来生成客户端代码。

  org.codehaus.mojo jaxws-maven-plugin  com.package1 src/main/java src/main/resources  wcf_webservice.wsdl    

您应该在com.package1有一个ObjectFactory类,您可以使用它来为您创建JAXBElements,例如:

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

正如旁注,你需要在jaxws使用之前展平wcf wsdl。

我在寻找同样的答案时偶然发现了这个问题。 我发布了一个答案,但发现了一些问题。 这是一种方法:

 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的类型参数。

希望这有效。

第一个参数名称是要镜像的XML元素的限定名称(本地名称+名称空间)。

declaredType是要绑定XML元素的类的类对象。

scope是XML Element的使用范围,但您可以将其设置为null。

valuedeclaredType类的实例,即绑定到实际XML元素实例的实际Java对象。

尝试在wsdl中使用minOccurs =“1”而不是minOccurs =“0”。 出于某些(好的)原因,代码生成器需要此信息才能将参数转换为基本的java类型参数。

那么用法在哪里……和例子。 我要它..

我找到了。 所以你可能会这样做……它会起作用。

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

我根据文档使用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);