java - parse - ¿Cómo se personaliza la forma en que JAXB genera los nombres de métodos en plural?
xml to java object jaxb online (2)
Por defecto, se genera lo siguiente para su fragmento de esquema:
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "physicianList", propOrder = {
"physician"
})
public class PhysicianList {
@XmlElement(name = "Physician")
protected List<Physician> physician;
public List<Physician> getPhysician() {
if (physician == null) {
physician = new ArrayList<Physician>();
}
return this.physician;
}
}
Si anota su esquema XML:
<xs:schema
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
jaxb:version="2.1">
<xs:complexType name="physician">
<xs:sequence>
</xs:sequence>
</xs:complexType>
<xs:complexType name="physicianList">
<xs:sequence>
<xs:element name="Physician"
type="physician"
minOccurs="0"
maxOccurs="unbounded">
<xs:annotation>
<xs:appinfo>
<jaxb:property name="physicians"/>
</xs:appinfo>
</xs:annotation>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
Entonces puedes generar la clase deseada:
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "physicianList", propOrder = {
"physicians"
})
public class PhysicianList {
@XmlElement(name = "Physician")
protected List<Physician> physicians;
public List<Physician> getPhysicians() {
if (physicians == null) {
physicians = new ArrayList<Physician>();
}
return this.physicians;
}
}
Estamos utilizando JAXB para generar clases de Java y hemos encontrado algunos casos donde los nombres de métodos de plural generados no son correctos. Por ejemplo, donde esperamos obtener getPhysicians
, estamos obteniendo getPhysicien
. ¿Cómo personalizaríamos cómo JAXB pluraliza métodos específicos?
El esquema:
<xs:complexType name="physician">
<xs:sequence>
...
</xs:sequence>
</xs:complexType>
<xs:complexType name="physicianList">
<xs:sequence>
<xs:element name="Physician"
type="physician"
minOccurs="0"
maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
El código Java generado:
...
public class PhysicianList {
...
@XmlElement(name = "Physician")
protected List<Physician> physicien;
...
public List<Physician> getPhysicien() {
if (physicien == null) {
physicien = new ArrayList<Physician>();
}
return this.physicien;
}
Actualizar
Esto ha sido respondido por Blaise. Sin embargo, prefiero no mezclar preocupaciones como las personalizaciones de JAXB en un esquema XML. Entonces, para aquellos de ustedes con la misma preferencia, aquí hay un archivo de enlace JAXB que logra lo mismo que lo que Blaise sugirió, manteniendo la personalización de JAXB fuera del esquema:
<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0">
<jaxb:bindings schemaLocation="myschema.xsd">
<jaxb:bindings node="//xs:complexType[@name=''physicianList'']//xs:element[@name=''Physician'']">
<jaxb:property name="physicians"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
Tal vez sea un poco tarde para responder, pero hay otra manera de generar nombres en plural simplemente, sin mezclar XML Schema y JAXB Bindings.
Mediante el uso del compilador de enlaces JAXB XJC con el modo "-extensión". Se debe agregar un archivo de enlaces de personalización, como este:
<?xml version="1.0"?>
<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"
jxb:extensionBindingPrefixes="xjc">
<jxb:globalBindings>
<xjc:simple/>
</jxb:globalBindings>
</jxb:bindings>
Referencias
- Modo de vinculación más simple experimental y mejor ( EDITAR: enlace obsoleto)
- Modo de enlace experimental más simple y mejor (nuevo enlace)
- JAXB: ¿Cómo cambiar los nombres de las clases generadas por XJC cuando se especifica el tipo attr en XSD?