Estoy utilizando el plugin de maven maven-jaxb2-plugin para generar POJOs de un archivo de Esquema XSD.
Esto funciona bien. La única cosa, eso es lo que realmente me molesta es, que el esquema xml enumeraciones no se asignan en Java de Tipo Enum.

Mi plugin de maven es la generación de java pojos de un archivo llamado schemachooser.xsd

schemachooser.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:sch="http://www.ascc.net/xml/schematron" 
targetNamespace="http://schema.something" elementFormDefault="qualified"
version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc" jaxb:version="1.0">

<xs:annotation>
    <xs:appinfo>
        <jaxb:globalBindings generateIsSetMethod="true" fixedAttributeAsConstantProperty="true">
            <xjc:serializable />
        </jaxb:globalBindings>
        <jaxb:schemaBindings>
           <jaxb:bindings node="//xsd:element[@name='ElementName']/xsd:simpleType">
               <jaxb:typesafeEnumClass name="MyEnumType" />
           </jaxb:bindings>
        </jaxb:schemaBindings>
    </xs:appinfo>
</xs:annotation>

<xs:include schemaLocation="myNormalSchema.xsd" />

</schema>

Genere los archivos, pero no la «nueva» Clase Enum «MyEnumType». Estoy utilizando los enlaces de malo?

InformationsquelleAutor M.R. | 2011-05-17

1 Comentario

  1. 28

    Si quieres mantener el JAXB anotaciones separadas del esquema XML, entonces usted necesita utilizar un JAXB archivo de enlaces:

    bindings.xml

    <jaxb:bindings 
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        jaxb:extensionBindingPrefixes="xjc"
        version="2.1">
        <jaxb:globalBindings generateIsSetMethod="true" fixedAttributeAsConstantProperty="true">
            <xjc:serializable />
        </jaxb:globalBindings>
        <jaxb:bindings schemaLocation="myNormalSchema.xsd">
            <jaxb:bindings node="//xs:element[@name='ElementName']/xs:simpleType">
                   <jaxb:typesafeEnumClass name="MyEnumType" />
            </jaxb:bindings>
       </jaxb:bindings>
    </jaxb:bindings>

    myNormalSchema.xsd

    A continuación se muestra un ejemplo de esquema XML que una ingeniería inversa a partir de su pregunta:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema 
        targetNamespace="http://www.example.com" 
         xmlns="http://www.example.com" 
         xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
        <xs:element name="ElementName">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:enumeration value="MY_ENUM_1"/>
                    <xs:enumeration value="MY_ENUM_2"/>
                </xs:restriction>
            </xs:simpleType>
       </xs:element>
    
        <xs:element name="Root">
            <xs:complexType>
                <xs:sequence>
                    <xs:element ref="ElementName"/>
                </xs:sequence>
            </xs:complexType>
        </xs:element>
    
    </xs:schema>

    XJC Llamada

    xjc -extension -d out -b bindings.xml myNormalSchema.xsd

    MyEnumType

    Una de las clases generadas es una enumeración llamada MyEnumType.

    package com.example;
    
    import javax.xml.bind.annotation.XmlEnum;
    import javax.xml.bind.annotation.XmlType;
    
    @XmlType(name = "")
    @XmlEnum
    public enum MyEnumType {
    
        MY_ENUM_1,
        MY_ENUM_2;
    
        public String value() {
            return name();
        }
    
        public static MyEnumType fromValue(String v) {
            return valueOf(v);
        }
    
    }

    Raíz

    También la Raíz de la clase se genera con el isSet método:

    package com.example;
    
    import java.io.Serializable;
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlType;
    
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {
        "elementName"
    })
    @XmlRootElement(name = "Root")
    public class Root
        implements Serializable
    {
    
        @XmlElement(name = "ElementName", required = true)
        protected MyEnumType elementName;
    
        public MyEnumType getElementName() {
            return elementName;
        }
    
        public void setElementName(MyEnumType value) {
            this.elementName = value;
        }
    
        public boolean isSetElementName() {
            return (this.elementName!= null);
        }
    
    }

    Ejemplos

    • Qué necesito para hacer vinculantes para todos los elementos de este tipo? Hay una manera para cambiar esta modificación para todas las cadenas restringido con la enumeración? He 287 apariciones en cuenta los esquemas y no puedo modificarlos.
    • Salvó mi día, pero lo que es un enorme dolor en el burro … que debe haber una mejor manera.

Dejar respuesta

Please enter your comment!
Please enter your name here