JAXB返回null而不是空字符串

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

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

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

谢谢。

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

   

遗憾的是,这意味着您传递的一个空字符串

如果要传递null ,则有两个选项:

  1. 根本不要传递此标记(您的XML根本不应包含标记)。
  2. 使用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