我是JAXB的新手,我想做一些我不知道它是否可行的事情。我有一个像这样编组的Java类:
@XmlAccessorType(XMLAccessType.NONE)
public class MyClass {
@XmlElement
private String a = "x";
@XmlElement
private String b = "xx";
@XmlElement
private boolean c = true;
...
}
并希望这样的XML输出:
<?xml ...?>
<MyClass>
<a>x</a>
<b>xx</b>
<c value="true"/>
</MyClass>
我想到的一种解决方案是使用布尔包装器类使其工作,但是我想避免这种情况,因为这使我无法使用布尔原语true,false。
我们可以在JAXB中做到吗?
最佳答案
利用XmlAdapter
您可以创建一个XmlAdapter
以获得所需的行为。 XmlAdapter
将域对象转换为另一种类型,以进行编组和解组。
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class BooleanAdapter extends XmlAdapter<BooleanAdapter.AdaptedBoolean, Boolean> {
public static class AdaptedBoolean {
@XmlAttribute
public boolean value;
}
@Override
public Boolean unmarshal(AdaptedBoolean adaptedBoolean) throws Exception {
return adaptedBoolean.value;
}
@Override
public AdaptedBoolean marshal(Boolean v) throws Exception {
AdaptedBoolean adaptedBoolean = new AdaptedBoolean();
adaptedBoolean.value = v;
return adaptedBoolean;
}
}
使用
XmlAdapter
要使用
XmlAdapter
,您的映射字段将需要为Boolean
类型而不是boolean
。如果需要,访问器方法仍然可以是boolean
。import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlAccessorType(XmlAccessType.NONE)
public class MyClass {
@XmlElement
private String a = "x";
@XmlElement
private String b = "xx";
@XmlElement
@XmlJavaTypeAdapter(BooleanAdapter.class)
private Boolean c = true;
public boolean getC() {
return c;
}
public void setC(boolean c) {
this.c = c;
}
}