我有一个带有两个字段“name”和“address”的Object。 JAXB在将对象转换为XMl时忽略空元素。
例如:如果我有name =“xyz”且地址= null,那么out将是
<name>xyz</name>
但我想要的输出为
<name>xyz</name>
<address></address>
我看过选项@XmlElement(nillable="true")
,但这会将输出显示为
<name>xyz</name>
<address xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
请帮助我获得所需的输出。
提前致谢。
答案 0 :(得分:6)
JAXB (JSR-222)实现将输出一个空字符串""
值作为空元素。您可以将address
属性设置为此属性以获得所需的效果。
更新#1
我已经更新了我的问题。基本上地址元素是NULL。是 这个解决方案也适用于那个?
您可以利用Marshal Event Callbacks来调整address
的价值。
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {
private String name;
private String address;
private void beforeMarshal(Marshaller marshaller) {
if(null == address) {
address = "";
}
}
private void afterMarshal(Marshaller marshaller) {
if("".equals(address)) {
address = null;
}
}
}
更新#2
唯一值得关注的是,如果我在课堂上有10个领域,我将会有 为所有字段写。还有其他解决方案吗?
如果您使用EclipseLink MOXy作为JAXB提供程序(我是MOXy负责人),那么您可以使用XmlAdapter
作为此用例。
XmlAdapter(StringAdapter)
package forum14691333;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class StringAdapter extends XmlAdapter<String, String> {
@Override
public String marshal(String string) throws Exception {
if(null == string) {
return "";
}
return string;
}
@Override
public String unmarshal(String string) throws Exception {
if("".equals(string)) {
return null;
}
return string;
}
}
<强>包信息强>
然后,如果您在包级别指定它,它将应用于该包中类型String
的所有映射字段/属性。
@XmlJavaTypeAdapter(value=StringAdapter.class, type=String.class)
package forum14691333;
import javax.xml.bind.annotation.adapters.*;
了解更多信息
答案 1 :(得分:1)
如果您使用EclipseLink MOXy作为JAXB提供程序,那么您可以使用
@XmlNullPolicy(emptyNodeRepresentsNull = true, nullRepresentationForXml = XmlMarshalNullRepresentation.EMPTY_NODE)
@XmlElement(name = "address", nillable = true)
private String address;
通过这种方式,您不必为所有字段编写适配器
答案 2 :(得分:0)
只需在字段上设置一个空字符串默认值。
@XmlElement(required="true")
private String address = "";
你会得到
<address></address>