Pau*_*ury 7 java xml jaxb marshalling
让我们说我有一堂课
@XmlRootElement(name="thing")
public class Thing{
private String name;
private boolean awesome;
@XmlValue public void setName(String name) {
this.name = name;
}
public String getName() {
return this.value;
}
@XmlAttribute public void setAwesome(boolean awesome) {
this.awesome = awesome;
}
public boolean isAwesome() {
return this.awesome;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我创建了一些东西,然后将它们编组为XML,它看起来像这样:
飞行忍者:
<thing awesome="true">flying ninja</thing>
Run Code Online (Sandbox Code Playgroud)
一个普通的老爆米花球:
<thing awesome="false">popcorn ball</thing>
Run Code Online (Sandbox Code Playgroud)
但是......我想要做的是改变我的布尔属性被编组的方式.我宁愿看到爆米花球看起来像这样,压抑了令人敬畏的属性:
<thing>popcorn ball</thing>
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
非常感谢!
注意: 我是EclipseLink JAXB(MOXy)的负责人,也是JAXB 2.X(JSR-222)专家组的成员.
使用MOXy,您可以XmlAdapter
按照Hovercraft Full Of Eels的建议进行操作.它看起来像:
BooleanAdapter
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class BooleanAdapter extends XmlAdapter<Boolean, Boolean> {
@Override
public Boolean unmarshal(Boolean v) throws Exception {
return Boolean.TRUE.equals(v);
}
@Override
public Boolean marshal(Boolean v) throws Exception {
if(v) {
return v;
}
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
事情
您将属性与XmlAdapter
使用@XmlJavaTypeAdapter
注释相关联,如下所示:
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement(name="thing")
public class Thing{
private String name;
private boolean awesome;
@XmlValue public void setName(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
@XmlAttribute
@XmlJavaTypeAdapter(BooleanAdapter.class)
public void setAwesome(boolean awesome) {
this.awesome = awesome;
}
public boolean isAwesome() {
return this.awesome;
}
}
Run Code Online (Sandbox Code Playgroud)
演示
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(Thing.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Thing thing = new Thing();
thing.setName("popcorn ball");
thing.setAwesome(false);
marshaller.marshal(thing, System.out);
thing.setAwesome(true);
marshaller.marshal(thing, System.out);
}
}
Run Code Online (Sandbox Code Playgroud)
产量
<?xml version="1.0" encoding="UTF-8"?>
<thing>popcorn ball</thing>
<?xml version="1.0" encoding="UTF-8"?>
<thing awesome="true">popcorn ball</thing>
Run Code Online (Sandbox Code Playgroud)
使用JAXB RI
如果使用JAXB RI运行此示例,则会出现以下异常:
Exception in thread "main" com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Adapter example.BooleanAdapter is not applicable to the field type boolean.
this problem is related to the following location:
at @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(type=class javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter$DEFAULT, value=class example.BooleanAdapter)
at public boolean example.Thing.isAwesome()
at forum251.Thing
Run Code Online (Sandbox Code Playgroud)
欲获得更多信息