2012-06-03 18 views
7

¿Cómo puedo recuperar el valor null, al descalificar, si el valor del atributo XML está vacío? Ahora hago dentro de mis captadores de cheques para null:JAXB return null en su lugar serie vacía

public String getLabel() { 
    if (label.isEmpty()) { 
     return null; 
    } 
    else { 
     return label; 
    } 
} 

existe, pero puede ser de otra manera, más elegante?

Gracias.

+1

¿Por qué no sería una mejor opción? En lugar de verificar si la cadena es nula -lo que tendrá que hacer para evitar NPE- después de la llamada, verifique si está vacía y listo. –

Respuesta

10

Creo que el código XML se ve más o menos así:

<myElement></myElement> 

Esto, lamentablemente, significa, que son pasar una cadena vacía.

Si desea pasar null tiene dos opciones:

  1. No deje pasar esta etiqueta en absoluto (el código XML no debe contener <myElement/> etiqueta en absoluto).
  2. Use xsi:nil.

Si se utiliza xsi:nil, lo primero que tiene que declarar el elemento XML (en el archivo XSD) como nilable, así:

<xsd:element name="myElement" nillable="true"/> 

Entonces, para pasar el valor null interior XML ello:

<myElement xsi:nil="true"/> 

o esto:

<myElement xsi:nil="true"></myElement> 

De esta manera, JAXB sabe que está pasando null en lugar de una cadena vacía.

6

La answer given by npe es buena, y especificar cómo quiere que se represente null sería mi recomendación también. Tener xsi:nil marshalled que se desea anotar su propiedad como (ver Binding to JSON & XML - Handling Null):

@XmlElement(nillable=true) 
public String getLabel() { 
    return label; 
} 

Si no desea cambiar su representación XML entonces se podría utilizar un XmlAdapter: EmptyStringAdapter

package forum10869748; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class EmptyStringAdapter extends XmlAdapter<String, String> { 

    @Override 
    public String unmarshal(String v) throws Exception { 
     if("".equals(v)) { 
      return null; 
     } 
     return v; 
    } 

    @Override 
    public String marshal(String v) throws Exception { 
     return v; 
    } 

} 

Foo

Hace referencia a XmlAdapter mediante el uso de la anotación @XmlJavaTypeAdapter. Si desea que este XmlAdapter se aplique a todas las cadenas, puede registrarlo en el nivel del paquete (consulte JAXB and Package Level XmlAdapters).

package forum10869748; 

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

@XmlRootElement 
public class Foo { 

    private String label; 

    @XmlJavaTypeAdapter(EmptyStringAdapter.class) 
    public String getLabel() { 
     return label; 
    } 

    public void setLabel(String label) { 
     this.label = label; 
    } 

} 

Demostración

package forum10869748; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Foo.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum10869748/input.xml"); 
     Foo foo = (Foo) unmarshaller.unmarshal(xml); 

     System.out.println(foo.getLabel()); 
    } 

} 

input.xml

<?xml version="1.0" encoding="UTF-8"?> 
<foo> 
    <label></label> 
</foo> 

salida

null 
+1

Pieza de código bastante útil, como un ejemplo de lo que puedes hacer con 'JAXB'. Pero en mi opinión, lo que propones aquí, es peligroso. Tratar las cadenas vacías como nulos sin ninguna notificación de que los nulos son posibles en el contrato ('WSDL',' XSD') es una especie de parche de mono, y es casi seguro que alguien, algún día, se verá realmente frustrado al eliminar esto. Si quieres tratar cadenas vacías y nulos de la misma manera, te sugiero usar [isBlank (String) de commons-lang] (http://commons.apache.org/lang/api-2.5/org/apache/commons/ lang/StringUtils.html # isBlank% 28java.lang.String% 29) – npe

+2

@npe - Estoy de acuerdo en que especificar '@XmlElement (nillable = true)' y representar explícitamente null en el XML es la mejor manera de hacerlo (incluso ascendí) tu respuesta). Agregué esta respuesta para aquellas personas que no pueden cambiar la representación XML. No lo considero peligroso, siempre y cuando el usuario sea coherente con lo que significan los elementos vacíos. –

Cuestiones relacionadas