注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。
默认情况下 MOXy 像其他 JAXB 实现一样不会将元素编组为空值:
可能的问题
我相信该strIpAddress
属性不为空,而是包含一个空字符串(“”)的值。这将导致空元素被写出。
根
package forum11215485;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
String nullValue;
String emptyStringValue;
String stringValue;
}
演示
package forum11215485;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Root root = new Root();
root.nullValue = null;
root.emptyStringValue = "";
root.stringValue = "Hello World";
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
输出
请注意如何没有为该nullValue
字段编组任何元素,并且该emptyStringValue
字段被编组为一个空元素。
<?xml version="1.0" encoding="UTF-8"?>
<root>
<emptyStringValue></emptyStringValue>
<stringValue>Hello World</stringValue>
</root>
解决方案 #1 - 确保属性设置为 null 而不是 ""
解决方案 #2 - 编写一个将 "" 转换为 null 的 XmlAdapter
AnXmlAdapter
是一种 JAXB 机制,它允许将一个对象编组为另一个对象。
字符串适配器
以下XmlAdapter
将空字符串编组为空。这将导致它们不出现在 XML 表示中。
package forum11215485;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class StringAdapter extends XmlAdapter<String, String> {
@Override
public String unmarshal(String v) throws Exception {
return v;
}
@Override
public String marshal(String v) throws Exception {
if(null == v || v.length() == 0) {
return null;
}
return v;
}
}
包信息
使用注解XmlAdapter
挂钩。@XmlJavaTypeAdapter
下面是一个在包级别挂钩它的示例,以便它适用于包中字符串类型的字段/属性。有关更多信息,请参阅: http ://blog.bdoughan.com/2012/02/jaxb-and-package-level-xmladapters.html
@XmlJavaTypeAdapter(value=StringAdapter.class, type=String.class)
package forum11215485;
import javax.xml.bind.annotation.adapters.*;
输出
现在运行演示代码的输出如下:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<stringValue>Hello World</stringValue>
</root>