2012-06-03 50 views
7

如何取回null值,解組時,如果裏面的XML屬性值爲空?現在,我讓我的干將檢查null內:JAXB返回null而不是空字符串

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

但可能存在一些其他的,更優雅的方式?

謝謝。

+1

爲什麼null會是更好的選擇?而不是檢查字符串是否爲空,在調用之後您必須執行以避免NPE,請檢查它是否爲空並且您已完成。 –

回答

10

我想你的XML看起來或多或少是這樣的:

<myElement></myElement> 

很不幸,意味着,你是傳遞一個空字符串

如果你想通過null你有兩個選擇:

  1. 千萬不要錯過這一切的標籤(您的XML不應包含<myElement/>標籤的話)。使用xsi:nil

如果使用xsi:nil,首先你必須聲明你的XML元素(XSD文件)作爲nilable,像這樣:然後

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

,通過內部的XML的null值做到這一點:

<myElement xsi:nil="true"/> 

或本:

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

這樣,JAXB知道,您通過null而不是空字符串。

6

answer given by npe是一個不錯的選擇,並指定你想代表null代表的方式也是我的建議。有xsi:nil編組,你會想你的註釋財產(見Binding to JSON & XML - Handling Null):

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

如果你不想改變你的XML表示,那麼你可以使用一個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; 
    } 

} 

您通過使用@XmlJavaTypeAdapter註釋引用XmlAdapter。如果您希望XmlAdapter適用於所有字符串,那麼您可以在包級別註冊它(請參閱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; 
    } 

} 

演示

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> 

輸出

null 
+1

相當有用的一段代碼 - 作爲你可以用'JAXB'完成的一個例子。但在我看來,你在這裏提出的是危險的。將空字符串作爲空值處理,而沒有任何合同中可能出現空值的通知('WSDL','XSD')是一種猴子補丁,而且幾乎可以肯定的是,某個人,有一天會真的非常沮喪地調試它。如果你想將空字符串和空值對待,我會建議使用commons-lang中的[isBlank(String)](http://commons.apache.org/lang/api-2.5/org/apache/commons/ lang/StringUtils.html#isBlank%28java.lang.String%29) – npe

+2

@npe - 我同意指定'@XmlElement(nillable = true)'並在XML中明確表示空值是最好的選擇(我甚至可以使用upvoted你的答案)。我爲這些人添加了這個答案,不能更改XML表示。我認爲這並不危險,只要用戶符合空元素的含義即可。 –

相關問題