2012-06-03 35 views
7

XML özniteliği değeri boş ise, unshashalling olduğunda null değerini nasıl alabilirim?JAXB dönüş boş yerine boş dize

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

Ancak bazı diğer daha şık bir şekilde mevcut olabilir: Şimdi null kontrol benim getters içeride yapmak?

Teşekkürler.

+1

Niçin daha iyi bir seçenek olur? Dize boş olup olmadığını kontrol etmek yerine - NPE'den kaçınmak için yapmanız gereken - çağrıdan sonra, boş olup olmadığını kontrol edin ve işiniz bitti. –

cevap

10

Ben XML fazla veya daha az şöyle düşünüyorum:

<myElement></myElement> 

Bu maalesef demektir, boş dize geçen olduğunu.

  1. (hiç <myElement/> etiketi içermemelidir sizin XML) hiç bu etiketi geçmesi yeterli değildir: null geçmek istiyorsanız

    iki seçeneğiniz vardır.

  2. xsi:nil'u kullanın.

ilk böyle, nilable olarak (XSD dosyasında) xml öğesi beyan etmek zorunda, xsi:nil kullanılıyorsa:

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

Sonra Bunu yapmak XML içinde null değerini geçmesine:

<myElement xsi:nil="true"/> 

veya bu:

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

Bu şekilde, JAXB boş bir String yerine null geçişini biliyor.

6

answer given by npe iyi bir tanesidir ve null'un nasıl temsil edildiğini belirtmek de önerimdir.

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

o zaman bir XmlAdapter kullanabilirsiniz XML gösterimini değiştirmek için istemiyorsanız: (Binding to JSON & XML - Handling Null bakınız) olarak xsi:nil mülkünüzü açıklama isteyecektir sıralıyor sahip olmak

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

@XmlJavaTypeAdapter ek açıklamasını kullanarak bir XmlAdapter başvurusunda bulunabilirsiniz. Eğer bu XmlAdapter'un tüm Strings'e uygulanmasını isterseniz, bunu paket seviyesine kaydedebilirsiniz (bkz. 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; 
    } 

} 

Deneme

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> 

Çıkış

null 
+1

Oldukça kullanışlı bir kod parçası - JAXB ile yapabileceğiniz şeylerin bir örneği olarak. Ama bence, burada teklif ettiğiniz şey tehlikeli. Boş dizeleri boş bırakarak herhangi bir bildirimde bulunmadan sözleşmelerde (WSDL, XSD) bir çeşit maymun-yama olduğunu ve neredeyse birilerinin, birgün gerçekten de, gerçekten bu hataya ayıklanacağını kesin olarak anımsatır. Boş dizeleri ve null'ları aynı şekilde tedavi etmek istiyorsanız, [isBlank (String) 'yi commons-lang]' den kullanmanızı öneririm (http://commons.apache.org/lang/api-2.5/org/apache/commons/ lang/StringUtils.html # isBlank% 28java.lang.String% 29) – npe

+2

@npe - XML'de null ifadesini açıkça belirtmek için '@XmlElement (nillable = true) 'yi belirtmenin en iyi yol olduğunu kabul ediyorum. senin cevabın). Bu cevabı, bu kişiler için XML gösterimini nasıl değiştiremediğimi ekledim. Kullanıcı, boş elemanların ne anlama geldiği ile tutarlı olduğu sürece, tehlikeli olduğunu düşünmüyorum. –

İlgili konular