2011-08-24 19 views
19

Quiero restringir los valores de entrada como estaenumeración JAXB con valores numéricos

<simpleType name="SomeCode"> 
    <restriction base="string"> 
    <enumeration value="036222B"/> 
    <enumeration value="036111C"/> 
    </restriction> 
</simpleType> 

Pero esto no genera una enumeración. Sospecho que es porque los valores comienzan con números y esto no está permitido para los valores de Enum.

¿Hay alguna solución o solución?

Respuesta

45

Aquí es mi respuesta a una pregunta similar que puede ayudar (véase el número 2):

Hay un par de valores de la enumeración que están causando este problema. Estos problemas pueden superarse mediante el uso de un archivo de enlace externo JAXB (ver a continuación).

Enum Edición # 1 - cadena vacía

Algunos de sus valores de enumeración son cadena vacía (""), que está causando una cadena en lugar de una propiedad de enumeración que se genere:

<xs:enumeration value=""> 
    <xs:annotation> 
     <xs:documentation>Blank</xs:documentation> 
    </xs:annotation> 
</xs:enumeration> 

enum Edición # 2 - cadena numérica

Algunos de los valores de enumeración son números que está causando una cadena en lugar de una propiedad de enumeración que se generen:

<xs:enumeration value="6"> 
    <xs:annotation> 
     <xs:documentation>6th grade</xs:documentation> 
    </xs:annotation> 
</xs:enumeration> 

Encuadernaciones Archivo (fijaciones.xml)

El archivo de enlaces siguiente se puede utilizar para hacer frente a los problemas con el educationLevelType, los conceptos aquí se pueden aplicar a todos los tipos problemáticos:

<jxb:bindings 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" 
    version="2.1"> 
    <jxb:bindings schemaLocation="http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd"> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='6']"> 
      <jxb:typesafeEnumMember name="SIX"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='7']"> 
      <jxb:typesafeEnumMember name="SEVEN"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='8']"> 
      <jxb:typesafeEnumMember name="EIGHT"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='9']"> 
      <jxb:typesafeEnumMember name="NINE"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='10']"> 
      <jxb:typesafeEnumMember name="TEN"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='11']"> 
      <jxb:typesafeEnumMember name="ELEVEN"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='12']"> 
      <jxb:typesafeEnumMember name="TWELVE"/> 
     </jxb:bindings> 
     <jxb:bindings node="//xs:simpleType[@name='educationLevelType']/xs:restriction/xs:enumeration[@value='']"> 
      <jxb:typesafeEnumMember name="BLANK"/> 
     </jxb:bindings> 
    </jxb:bindings> 
</jxb:bindings> 

La llamada XJC se puede hacer como sigue (la bandera -nv se describe a continuación):

xjc -nv -b bindings.xml -d out http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd 

Esto hará que el siguiente Enum que se genere:

package gov.hhs.acf.nytd; 

import javax.xml.bind.annotation.XmlEnum; 
import javax.xml.bind.annotation.XmlEnumValue; 
import javax.xml.bind.annotation.XmlType; 

@XmlType(name = "educationLevelType") 
@XmlEnum 
public enum EducationLevelType { 

    @XmlEnumValue("under 6") 
    UNDER_6("under 6"), 

    @XmlEnumValue("6") 
    SIX("6"), 

    @XmlEnumValue("7") 
    SEVEN("7"), 

    @XmlEnumValue("8") 
    EIGHT("8"), 

    @XmlEnumValue("9") 
    NINE("9"), 

    @XmlEnumValue("10") 
    TEN("10"), 

    @XmlEnumValue("11") 
    ELEVEN("11"), 

    @XmlEnumValue("12") 
    TWELVE("12"), 

    @XmlEnumValue("post secondary") 
    POST_SECONDARY("post secondary"), 

    @XmlEnumValue("college") 
    COLLEGE("college"), 
    @XmlEnumValue("") 

    BLANK(""); 
    private final String value; 

    EducationLevelType(String v) { 
     value = v; 
    } 

    public String value() { 
     return value; 
    } 

    public static EducationLevelType fromValue(String v) { 
     for (EducationLevelType c: EducationLevelType.values()) { 
      if (c.value.equals(v)) { 
       return c; 
      } 
     } 
     throw new IllegalArgumentException(v); 
    } 

} 

maxOcurrencias Issue

Para el tema maxOcurrencias, la siguiente línea de comandos con el sin verificar (-nv) bandera se puede utilizar para analizar el esquema XML:

xjc -nv -d out http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd 

Este le hará pasar el siguiente error sin tener que modificar el esquema XML:

análisis de un esquema ... [ERROR] La configuración actual del del analizador no permite permitir que un valor de atributo maxOccurs a sea mayor que el valor de 5,000.
línea 41 de http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd

un error al analizar un esquema.

Para más información

+1

¿Tiene el XSD que utilizó en el ejemplo? El enlace http://www.acf.hhs.gov/programs/cb/systems/nytd/nytd_data_file_format.xsd ya no está disponible. –

5

Sí. Puede definir la enumeración usted mismo en lugar de tener XJC generarlo. Entonces podrías instruir a XJC para que use esa enumeración. Sin embargo, necesitarás una clase de adaptador.

import acme.MyEnum; 

public class MyEnumadapter { 

    public static MyEnum unmarshal(final String value) { 
     if(value == null) 
      return null; 
     //use some method to identify the enum by the value and return 
    } 

    public static String marshal(final MyEnum value) { 
     if (value == null) 
      return null; 
     //use some method to get the value for the enum 
    } 

} 

ya sea en un archivo de enlaces o incrustado en el esquema, personalizar los enlaces de la siguiente manera:

<bindings node="//xs:simpleType[@name='SomeCode']"> 
    <javaType name="acme.MyEnum" 
     parseMethod="MyEnumAdapter.unmarshal" 
     printMethod="MyEnumAdapter.marshal"/> 
</bindings> 

MyEnumAdapter está en el paquete por defecto aquí, así que asegúrese de que utiliza los nombres completos cuando se hace esto tu mismo

Cuestiones relacionadas