2012-06-03 32 views
7

Come posso recuperare il valore null, quando non si esegue il marshalling, se il valore dell'attributo XML interno è vuoto? Ora faccio nei miei getter controllo per null:JAXB restituisce una stringa vuota invece vuota

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

ma potrebbe essere esiste un altro modo, più elegante?

Grazie.

+1

Perché null sarebbe un'opzione migliore? Invece di controllare se la stringa è nullo -che devi fare per evitare NPE- dopo la chiamata, controlla se è vuota e il gioco è fatto. –

risposta

10

Credo che la vostra XML sembra più o meno così:

<myElement></myElement> 

Questo, purtroppo, significa, che tu sei passando una stringa vuota.

Se si desidera passare null si hanno due opzioni:

  1. non passare questo tag a tutti (il tuo XML non deve contenere <myElement/> tag a tutti).
  2. Utilizzare xsi:nil.

Se si utilizza xsi:nil, in primo luogo si deve dichiarare il vostro elemento XML (nel file XSD) come nilable, in questo modo:

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

Poi, per passare il valore null all'interno XML fare questo:

<myElement xsi:nil="true"/> 

o questo:

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

In questo modo, JAXB sa che stai passando null invece di una stringa vuota.

6

Il answer given by npe è un buono, e specificare come si desidera rappresentare null sarebbe la mia raccomandazione pure. Per avere xsi:nil Marshalled si vuole annotare la vostra proprietà come (vedi Binding to JSON & XML - Handling Null):

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

Se non si desidera modificare la rappresentazione XML allora si potrebbe utilizzare 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

Si fa riferimento a XmlAdapter tramite l'uso dell'annotazione @XmlJavaTypeAdapter. Se si desidera che questo XmlAdapter venga applicato a tutte le stringhe, è possibile registrarlo a livello di pacchetto (vedere 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; 
    } 

} 

Demo

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> 

uscita

null 
+1

Parte del codice molto utile - come esempio di cosa si può fare con 'JAXB'. Ma secondo me, ciò che proponi qui è pericoloso. Trattare le stringhe vuote come null senza alcuna notifica che i valori nulli siano possibili nel contratto ('WSDL',' XSD') è un tipo di patch-scimmia, ed è quasi certo che qualcuno, un giorno, si troverà davvero frustrato nel debugging di questo. Se si desidera trattare le stringhe vuote e null uguali, suggerirei di usare [isBlank (String) da commons-lang] (http://commons.apache.org/lang/api-2.5/org/apache/commons/ lang/StringUtils.html # isBlank% 28java.lang.String% 29) – npe

+2

@npe - Sono d'accordo che specificare "@XmlElement (nillable = true)" e rappresentare esplicitamente null nell'XML è il modo migliore per andare (ho anche upvoted la tua risposta). Ho aggiunto questa risposta per quelle persone come non può cambiare la rappresentazione XML. Non lo considero pericoloso, a patto che l'utente sia coerente con ciò che significano gli elementi vuoti. –

Problemi correlati