JAXB返回null而不是空字符串

时间:2012-06-03 11:00:11

标签: java jaxb

如果解组,如果XML属性值为空,我如何检索null值?现在我在getter中查看null

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

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

感谢。

2 个答案:

答案 0 :(得分:10)

我认为您的XML看起来或多或少是这样的:

    <myElement></myElement>

不幸的是,这意味着您传递空字符串

如果您想通过null,您有两种选择:

  1. 根本不要传递此标记(您的XML根本不应包含<myElement/>标记。)
  2. 使用xsi:nil
  3. 如果使用xsi:nil,首先必须将xml元素(在XSD文件中)声明为nilable,如下所示:

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

    然后,要在XML中传递null值,请执行以下操作:

        <myElement xsi:nil="true"/>
    

    或者这个:

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

    这样,JAXB知道你传递null而不是空字符串。

答案 1 :(得分:7)

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

}

<强>富

您通过使用XmlAdapter注释引用@XmlJavaTypeAdapter。如果您希望将此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
相关问题