jaxbelement create java xml wcf web-services

java - jaxbelement create instance



¿Cómo usar JAXBElement<String> en el servicio web? (8)

El primer nombre de parámetro es un nombre calificado (nombre local + espacio de nombre) del elemento XML que está duplicando.

declaredType es el objeto de clase de la clase a la que está vinculando su elemento XML.

scope es el alcance de uso del Elemento XML, pero puede establecerlo como nulo.

valor es una instancia de clase declarada tipo , es decir, el objeto real de Java vinculado a la instancia del elemento XML real.

Estoy desarrollando un servicio web interoperable usando WCF que estoy consumiendo de un cliente Java. Cuando creé la clase de proxy, JAXBElement<String> todos los métodos getter y setter, así como un campo JAXBElement<String> . Busqué esto en la API de JDK y encontré el constructor:

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

¿Cómo debería usar este constructor? Por favor explique los parámetros y avíseme si hay un buen tutorial en Internet que describa su uso.


Entonces, ¿dónde está el uso ... y el ejemplo? Lo quiero..

Lo encontré. Entonces quizás hagas eso ... Funcionará.

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


Intente utilizar minOccurs = "1" en lugar de minOccurs = "0" en su wsdl. Por alguna (buena) razón, el generador de códigos necesita esta información para convertir parámetros a parámetros básicos de tipo java.


Me encontré con esta pregunta mientras buscaba la misma respuesta. Publiqué una respuesta, pero encontré algunos problemas. Aquí hay una manera de hacerlo:

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

El último significa el parámetro de tipo de JAXBElement .

Espero que esto funcione.


Simplemente estoy haciendo exactamente lo mismo, utilizando un cliente Java para entender el servicio web de WCF. Estoy usando el plugin jaxws maven para generar el código del lado del cliente.

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

Debería tener una clase ObjectFactory en su com.package1 que puede usar para crear sus JAXBElements para usted, por ejemplo:

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

Como nota al margen, deberá aplanar wcf wsdl antes de que jaxws pueda usarlo.


Solo en caso de que alguien termine buscando una solución: en lugar de usar JAXBElement, solo se puede usar el tipo al establecer el valor de generateElementProperty en un archivo de enlaces.

En mi caso, estoy usando maven para generar los archivos stub de wsdl.

archivo parcial pom y archivo de enlaces (en esta configuración se llama 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>


Tuve problemas para probar los métodos anteriores utilizando JAXBElement según la documentación y encontré esto en su lugar, lo cual funcionó perfectamente para 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);


Una solución para este problema es que no necesita crear un constructor separado para crear un JAXBElement . El elemento respetado se puede recuperar del objectFactory.create........() . Supongamos que desea crear y establecer algún valor en el objeto de respuesta, y el argumento es de tipo JAXBElement , entonces debe hacerlo de esta manera:

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

Nota: compruebe la referencia de ObjectFactory porque puede haber varias clases de ObjectFactory en el código generado, por lo que debe referir el que está asociado a la clase de ese paquete.