2010-05-05 8 views
7

JAXB treets vacío int atributo XML como 0, lo cual está bien conmigo, pero tengo la necesidad de almacenarlo como un nulo. Parece que no puedo cambiar la clase DataConverterImpl a la implementación personalizada. ¿Qué se podría hacer en todo caso?JAXB treets vacío int atributo XML como 0

<xs:attribute name="Count" type="Integer0to999" use="optional"> 

<xs:simpleType name="Integer0to999"> 
    <xs:annotation> 
     <xs:documentation xml:lang="en">Used for Integer values, from 0 to 999 inclusive</xs:documentation> 
    </xs:annotation> 
    <xs:restriction base="xs:integer"> 
     <xs:minInclusive value="0"/> 
     <xs:maxInclusive value="999"/> 
    </xs:restriction> 
    </xs:simpleType> 

Después de la compilación del esquema xjc llegué clase con lo siguiente:

@XmlAttribute(name = "Count") 
    protected Integer passengerCount; 

Durante XML analizan parseInt() ser llamado desde DataConverterImpl.class de Sun (Oracle), que es el código de abajo, su neve va para obtener nulo de este código:

public static int _parseInt(CharSequence s) { 
     int len = s.length(); 
     int sign = 1; 

     int r = 0; 

     for(int i=0; i<len; i++) { 
      char ch = s.charAt(i); 
      if(WhiteSpaceProcessor.isWhiteSpace(ch)) { 
       // skip whitespace 
      } else 
      if('0'<=ch && ch<='9') { 
       r = r*10 + (ch-'0'); 
      } else 
      if(ch=='-') { 
       sign = -1; 
      } else 
      if(ch=='+') { 
       ; // noop 
      } else 
       throw new NumberFormatException("Not a number: "+s); 
     } 

     return r*sign; 
    } 

Respuesta

1

Usted coul Intente escribir un XMLAdaptor personalizado que convierta su entero en una Cadena (u otro objeto), luego conviértalo de nuevo como mejor le parezca. Durante el desemparejamiento, me imagino que un chequeo rápido y sin mayúsculas para 'nulo' sería todo lo que necesitarías.

de inicio aquí: http://download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/adapters/XmlAdapter.html

conectar el adaptador a su campo int y escribir el cuerpo.

Su convertidor empezaría de la siguiente manera:

public class MyIntConverter extends XmlAdapter<String,Integer> 
{ 
    @Override 
    public String marshal(Integer value) throws Exception { 

     if (value.intValue() == 0) 
        return null; // Or, "null" depending on what you'd like 

      return value.toString(); 
    } 

    @Override 
    public Integer unmarshal(String storedValue) throws Exception { 

     if (storedValue.equalsIgnoreCase("null")) 
        return 0; 

      return Integer.valueOf(storedValue); 
    } 
} 

Entonces, usted podría ponerla en uso:

@XmlJavaTypeAdapter(MyIntConverter.class) 
int someNumber; 

El código no se ha probado, pero creo que debería resolver el problema.

1

FWIW, Actualmente estoy descubriendo que JAXB elimina un elemento vacío a cero (si es un campo Entero) pero anula si es un campo Largo.

Es cierto que podría haber algún tipo de problema con los convertidores de datos personalizados. O podría ser un error con la versión JAXB con JDK 6.0 y es posible que esté utilizando una versión posterior.

Cuestiones relacionadas