2011-02-27 4 views
7

tengo una clase DTO con un campo como:JAXB: cómo hacer JAXB NO a deserializar cadena vacía a 0

@XmlAttribute 
@NotNull 
private Integer number = null; 

Estoy intentando xml unmarshal como

... number="" ... 

Necesito que el campo nuber permanezca nulo, para que se genere una excepción de validación. En su lugar, JAXB lo desasigna como 0 ¿Cómo puedo hacer que se comporte correctamente?

Respuesta

9

Arguable, es es se está comportando correctamente. number="" no significa nulo, es una cadena vacía, y JAXB tiene que tratar de manejarlo correctamente, y decide que lo más parecido a la cadena vacía para un tipo de datos entero es cero. Si quería un null, entonces el atributo number debería omitirse por completo.

Si desea personalizar este comportamiento, debe escribir una subclase de javax.xml.bind.annotation.adapters.XmlAdapter que pueda gestionar la conversión entre String sin formato y el tipo encuadernado (es decir, entre Cadena y Entero) de la manera que desee. Luego cablee ese adaptador anotando el campo con @XmlJavaTypeAdapter.

+1

No estoy completamente de acuerdo con que esto sea un comportamiento correcto. No hay conversión implícita entre cadena vacía y un int (por ejemplo, Integer.parseInt ("") arroja NumberFormatException en este caso). Y no es que quiera un nulo: estoy desmarcando la entrada del cliente, y los códigos de error que se devuelven deben ser los mismos en el caso de que el atributo numérico se haya omitido o no tenga ningún valor. –

+2

@RA: Puede estar en desacuerdo, es justo, pero estoy totalmente en desacuerdo con que una cadena vacía "no tenga valor". It * is * a value, es una String vacía, y no es lo mismo que 'null'. Pero independientemente de lo que cualquiera de nosotros piense que es "correcto", lo único que importa es lo que piensa JAXB. – skaffman

+0

cadena vacía no es un "valor nulo", es solo un "valor no convertible a int" :) –