partir online generar from example create clases java xsd jaxb

online - xsd java xjc



JAXB-La propiedad "Valor" ya está definida. Use<jaxb: property> para resolver este conflicto (7)

Usar JAXB para generar clases de enlace XML.

El esquema se basa en un conjunto de archivos XML heredados e incluye este fragmento:

<xs:complexType name="MetaType"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="Name" /> <xs:attribute type="xs:string" name="Scheme" /> <xs:attribute type="xs:string" name="Value" /> </xs:extension> </xs:simpleContent> </xs:complexType>

El atributo ''Valor'' entra en conflicto con la propiedad ''valor'' de xs:string , y la generación del código falla con el error:

com.sun.istack.SAXParseException2: Property "Value" is already defined. Use &lt;jaxb:property> to resolve this conflict.


Este archivo de enlaces mencionado en la otra respuesta no funcionó para mí con CXF 3.0.0. Tenga en cuenta que jaxb namespace tiene un elemento "bindings" y también el espacio de nombres jaxws, por lo que debemos declararlos:

<?xml version="1.0" encoding="UTF-8"?> <bindings xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns="http://java.sun.com/xml/ns/jaxws" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema" wsdlLocation="mesh.wsdl" > <bindings node="wsdl:definitions/wsdl:types/xs:schema[..."> <jaxb:bindings node="./xs:element[@name=''Profiles'']"> <jaxb:property name="ProfilesElement"/> </jaxb:bindings> </bindings> </bindings>

En mi caso, el esquema ya estaba dentro del WSDL, así que no tuve que especificar el atributo schemaLocation.


La respuesta está en hacer uso de enlaces JAXB ( site-template.xjb ):

<bindings xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.1"> <bindings schemaLocation="site-template.xsd" version="1.0"> <!-- Customise the package name --> <schemaBindings> <package name="com.example.schema"/> </schemaBindings> <!-- rename the value element --> <bindings node="//xs:complexType[@name=''MetaType'']"> <bindings node=".//xs:attribute[@name=''Value'']"> <property name="ValueAttribute"/> </bindings> </bindings> </bindings> </bindings>

Las expresiones XPath ubican los nodos y lo renombran, evitando así el conflicto de nombres.

Al usar este archivo XML de enlaces, la clase Java generada termina teniendo el getValueAttribute() (así como el getValue() ).


Ninguno de estos enlaces funcionó para mí, tengo este error:

[ERROR] La evaluación de XPath de ".//xs:attribute[@name=''Value'']" produce un nodo de destino vacío

Produjo un nodo objetivo vacío ... Entonces me di cuenta (después de 30 minutos de dispair) que mi enlace apuntaba a un tipo complejo en lugar de a un elemento. La respuesta estaba en mi archivo xsd.

Gracias


Si desea evitar la creación / cambio de un archivo de enlaces JAXB, y no le importa anotar su XSD, puede agregar la anotación jxb: property a la definición de su atributo, por ejemplo:

<xs:complexType name="MetaType"> <xs:simpleContent> <xs:extension base="xs:string"> <xs:attribute type="xs:string" name="Name" /> <xs:attribute type="xs:string" name="Scheme" /> <xs:attribute type="xs:string" name="Value"> <!-- rename property generated by JAXB (avoiding "Value" name conflict) --> <xs:annotation> <xs:appinfo> <jxb:property name="valueAttribute"/> </xs:appinfo> </xs:annotation> </xs:attribute> </xs:extension> </xs:simpleContent> </xs:complexType>

con adiciones adecuadas a la etiqueta xs: schema:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" jxb:version="2.1">


Tuve un problema al usar la solución con Eclipse (probé con Helios SR1 y Juno SR1) y con CXF 2.6.3. La solución fue similar a lo que dice Kaitsu. A saber, el nuevo> Asistente de servicio web de Eclipse copia el wsdl en el contenido web foldre / wsdl. Tuve que colocar el wsdl y el archivo vinculante allí. De lo contrario, el archivo de enlace arrojó el error "no es parte de esta compilación".

No pude usar un esquema en línea en el WSDL, pero sí trabajó con un esquema externo como en la respuesta # 1.

Estoy usando la opción de configuración del punto final de CXF Servlet. En mi WSDL tengo:

<wsdl:port binding="axis2:ConverterSOAP12Binding" name="ConverterSOAP12port_http"> <soap12:address location="http://localhost/Converter/services/Converter"/> </wsdl:port>

El asistente generó esto en mi web.xml, que funciona bien:

<servlet-mapping> <servlet-name>cxf</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>

Pero puso esto en cxf-servlet.xml:

<jaxws:endpoint xmlns:tns="http://wtp" id="converterporttype" implementor="wtp.ConverterPortTypeImpl" wsdlLocation="wsdl/Converter.wsdl" endpointName="tns:ConverterSOAP12port_http" serviceName="tns:Converter" address="/ConverterSOAP12port_http"> <jaxws:features> <bean class="org.apache.cxf.feature.LoggingFeature" /> </jaxws:features> </jaxws:endpoint>

Tuve que cambiar la dirección a la URL completa, así:

address="http://localhost:8080/Converter/services/Converter">


Una vez que se haya creado el archivo xxxx.xjb para el nombre de atributo duplicado "valor" (el valor predeterminado de "duplicado" es el proporcionado por JAXB), ejecute el comando XJC para crear objetos JAXB.

xjc -p "com.track.doc" -d "C: / JAXBDocuments / prasam / Desktop / JAXB_me / DealerTrace" appSamp.xsd -b xxxx.xjb

appSmp.xsd : -

<xsd:complexType name="range"> <xsd:simpleContent> <xsd:extension base="xsd:string"> <xsd:attribute name="value" type="xsd:string"/> </xsd:extension> </xsd:simpleContent> </xsd:complexType>

xxxx.xjb : -

<?xml version="1.0" encoding="UTF-8"?> <bindings xmlns="http://java.sun.com/xml/ns/jaxb" xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="2.1"> <bindings schemaLocation="appSmp.xsd" version="1.0"> <schemaBindings> <package name="com.track.doc"/> </schemaBindings> <bindings node="//xs:complexType[@name=''range'']"> <bindings node=".//xs:attribute[@name=''value'']"> <property name="valueAttribute"/> </bindings> </bindings> </bindings> </bindings>


también puede usar el parámetro -XautoNameResolution en la línea de comando y también en el complemento para que jxc resuelva el nombre si no se molesta por el nombre en las clases.