Actualmente estoy usando JAXB para generar clases Java para destrabar XML. Ahora me gustaría crear un nuevo esquema muy similar al primero y hacer que las clases que se generan implementen la misma interfaz.Generación de una clase JAXB que implementa una interfaz
decir, por ejemplo, tengo dos archivos de esquema XML que definen con etiquetas similares:
adult.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Age" type="xs:integer" />
<xs:element name="Job" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
kid.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Age" type="xs:integer" />
<xs:element name="School" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
Usando JAXB y XJC I' Me gusta generar dos archivos de clase:
public class Adult implements Person {
...
public String getName() { ... }
public int getAge() { ... }
public String getJob { ... }
}
public class Kid implements Person {
...
public String getName() { ... }
public int getAge() { ... }
public String getSchool { ... }
}
donde la interfaz de persona define los métodos getName()
y getAge()
.
He examinado algunas de las documentation para las interfaces de mapeo, pero esto parece ser solo para la situación en la que ya tiene clases Java que desea asignar a un DOM.
Además, he intentado usar este external plugin pero parece que no funciona.
<jxb:bindings version="1.0"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
xmlns:ext="http://xml.w-wins.com/xjc-plugins/interfaces"
jxb:extensionBindingPrefixes="xjc">
<jxb:bindings schemaLocation="xsd/adult.xsd" node="xs:schema/xs:complexType[@name='Person']">
<ext:interface>mypackage.Hello</ext:interface>
</jxb:bindings>
</jxb:bindings>
pero esto da el siguiente error::
$ java -cp "lib/activation.jar;lib/InterfacesXJCPlugin.jar;lib/jaxb1-impl.jar;lib/jaxb-api.jar;lib/jaxb-xjc.jar;lib/jsr173_1.0_api.jar" com.sun.tools.xjc.XJCFacade -p mypackage.myxml -extension -Xinterfaces xsd/adult.xsd -b binding.xjb
parsing a schema...
[ERROR] XPath evaluation of "xs:schema/xs:complexType[@name='Person']" results in empty target node
line 8 of file:/C:/dev/jaxb/jaxb-ri/binding.xjb
Failed to parse a schema.
¿Es posible generar una clase con JAXB que implementa una interfaz Aquí está mi xjb archivo de enlace?
actualización
He intentado usar el plugin Interface Insertion pero por alguna razón no puede conseguir que funcione. Así es como yo estoy llamando xjc sin embargo, es como si el frasco plugin no está para ser recogido de la ruta de clases:
$ java -cp "lib/xjc-if-ins.jar;lib/jaxb-xjc.jar" com.sun.tools.xjc.XJCFacade -p mypackage -extension -Xifins myschema.xsd -b binding.xjb
me sale el error:
unrecognized parameter -Xifins
¿Alguna idea?
El complemento de inserción de interfaz se puede utilizar para hacer que una clase generada a partir de un elemento XSD implemente una determinada interfaz. Aquí quiere generar una clase basada en su nombre de esquema; necesitará otro complemento para hacerlo. He logrado que la inserción de la interfaz funcione con maven. Avísame si necesitas los detalles. Las fuentes de la inserción de la interfaz están aquí: https://jaxb2-commons.dev.java.net/interface-insertion/xjc-if-ins-src.jar – rochb