注:我是EclipseLink JAXB (MOXy)鉛和JAXB 2 (JSR-222)專家小組的成員。
我已經進入了一個增強請求有這種行爲增加的EclipseLink JAXB(莫西):
解決
由於周圍的工作,如果你所有的映射的字符串字段/屬性映射到XML元素,則以下XmlAdapter方法可能適用於您:
NullStringAdapter
這XmlAdapter
將編組的String
實例作爲對象稱爲AdaptedString
。 AdaptedString
包含String
值以及映射到xsi:nil
屬性的字段。在XmlAdapter
中,我們將根據String
值是否爲空來設置該字段的值。
package forum8841221;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.*;
public class NullStringAdapter extends XmlAdapter<NullStringAdapter.AdaptedString, String> {
@Override
public AdaptedString marshal(String v) throws Exception {
AdaptedString adaptedString = new AdaptedString();
if(null == v) {
adaptedString.nil = true;
}
adaptedString.value = v;
return adaptedString;
}
@Override
public String unmarshal(AdaptedString v) throws Exception {
return v.value;
}
public static class AdaptedString {
@XmlAttribute(namespace="http://www.w3.org/2001/XMLSchema-instance")
public Boolean nil;
@XmlValue
@XmlJavaTypeAdapter(VoidStringAdapter.class)
public String value;
}
public static class VoidStringAdapter extends XmlAdapter<String, String> {
@Override
public String marshal(String v) throws Exception {
return v;
}
@Override
public String unmarshal(String v) throws Exception {
return v;
}
}
}
包信息
我們可以註冊,我們希望這個XmlAdapter
通過在封裝級註冊XmlAdapter
適用於所有的映射String
場/關於這個軟件包的屬性。
@XmlJavaTypeAdapter(value=NullStringAdapter.class, type=String.class)
@XmlSchema(xmlns={@XmlNs(namespaceURI = "http://www.w3.org/2001/XMLSchema-instance", prefix = "xsi")})
package forum8841221;
import javax.xml.bind.annotation.adapters.*;
import javax.xml.bind.annotation.*;
根
下面是我用這個例子的領域類。它有幾個字符串的屬性,它們中的一個註釋有@XmlElement(的nillable =真)
package forum8841221;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Root {
private String a;
private String b;
private String c;
private String d;
public String getA() {
return a;
}
public void setA(String a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
@XmlElement(nillable=true)
public String getD() {
return d;
}
public void setD(String d) {
this.d = d;
}
}
演示
package forum8841221;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Root root = new Root();
root.setB("B");
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);
}
}
輸出
<?xml version="1.0" encoding="UTF-8"?>
<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<a xsi:nil="true"/>
<b>B</b>
<c xsi:nil="true"/>
<d xsi:nil="true"/>
</root>