2011-05-17 38 views
20

Estoy usando el plugin maven maven-jaxb2-plugin para generar POJOs desde un archivo de esquema XSD. Esto funciona bien. Lo único que realmente me molesta es que las enumeraciones del esquema xml no están mapeadas en un tipo de Enume de Java.¿Cómo generar Java Enum desde el esquema XML con JAXB?

Mi plugin de Maven está generando los POJOs Java a partir de un archivo que se llama 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> 

sí genera los archivos, pero no el "nuevo" Enum Clase "MyEnumType". ¿Estoy usando las ataduras mal?

Respuesta

26

Si desea mantener las anotaciones JAXB separado del esquema XML a continuación, es necesario utilizar un archivo de enlaces JAXB:

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 esquema XML de muestra que se ha modificado mediante 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 se genera la clase raíz con el método isSet:

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

+2

¿Necesito hacer enlaces para todos los elementos de este tipo? ¿Hay alguna forma de cambiar esta modificación para todas las cadenas restringidas con enumeración? Tengo 287 ocurrencias en los esquemas proporcionados y no puedo modificarlos. –

+0

Me salvó el día, pero qué gran dolor en el burro ... debería haber una mejor manera. – mhvelplund

Cuestiones relacionadas