簡體   English   中英

JAXB返回null而不是空字符串

[英]JAXB return null instead empty string

當解組時,如果XML屬性值為空,我如何檢索null值? 現在我在getter中檢查是否為null

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

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

謝謝。

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

    <myElement></myElement>

遺憾的是,這意味着您傳遞的一個空字符串

如果要傳遞null ,則有兩個選項:

  1. 根本不要傳遞此標記(您的XML根本不應包含<myElement/>標記)。
  2. 使用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而不是空字符串。

npe給出的答案是一個很好的答案 ,並指定你想要null表示的方式也是我的建議。 要讓xsi:nil編組,您需要將屬性注釋為(請參閱綁定到JSON和XML - 處理空 ):

@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;
    }

}

XmlAdapter通過使用@XmlJavaTypeAdapter批注來引用@XmlJavaTypeAdapter 如果您希望將此XmlAdapter應用於所有字符串,則可以在包級別注冊它(請參閱JAXB和包級別XmlAdapter )。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM