web-dev-qa-db-fra.com

Comment personnalisez-vous la façon dont JAXB génère plusieurs noms de méthode?

Nous utilisons JAXB pour générer des classes Java et nous avons rencontré quelques cas où les noms de méthode plurielle générés ne sont pas corrects. Par exemple, où nous nous attendons à getPhysicians nous obtenons getPhysicien. Comment personnaliser la façon dont JAXB pluralise des méthodes spécifiques?

Le schéma:

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

Le code généré Java:

...
public class PhysicianList {
...

    @XmlElement(name = "Physician")
    protected List<Physician> physicien;
    ...

    public List<Physician> getPhysicien() {
        if (physicien == null) {
            physicien = new ArrayList<Physician>();
        }
        return this.physicien;
    }

Mise à jour

Cela a été répondu par Blaise. Cependant, je préfère ne pas mélanger les problèmes tels que les personnalisations JAXB dans un schéma XML. Donc, pour ceux d'entre vous qui ont la même préférence, voici un fichier de liaison JAXB qui réalise la même chose que ce que Blaise a suggéré, en gardant la personnalisation JAXB hors du schéma:

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

Par défaut, les éléments suivants sont générés pour votre fragment de schéma:

    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 vous annotez votre schéma 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>

Ensuite, vous pouvez générer la classe souhaitée:

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

}
29
bdoughan

Il est peut-être un peu tard pour répondre, mais il existe un autre moyen de générer simplement plusieurs noms, sans mélanger le schéma XML et les liaisons JAXB.

En utilisant le compilateur de liaisons JAXB XJC avec le mode "-extension". Un fichier de liaisons de personnalisation doit être ajouté, comme celui-ci:

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

Références :

14
Guillaume Husta