JAXB返回null而不是空字符串
当解组时,如果XML属性值为空,我如何能够检索null
值? 现在我在getter中检查null
:
public String getLabel() { if (label.isEmpty()) { return null; } else { return label; } }
但可能存在一些其他更优雅的方式?
谢谢。
我认为你的XML看起来或多或少是这样的:
遗憾的是,这意味着您传递的是一个空字符串 。
如果要传递null
,则有两个选项:
- 根本不要传递此标记(您的XML根本不应包含
标记)。 - 使用
xsi:nil
。
如果使用xsi:nil
,首先必须将xml元素(在XSD文件中)声明为nilable
,如下所示:
然后,要在XML中传递null
值,请执行以下操作:
或这个:
这样,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 { @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中
产量
null