java – JAXB / MOXy:当元素丢失时,不要调用XmlElementWrapper setter吗?
作者:互联网
我在一个类上有一个列表设置器,该类使用@XmlElementWrapper(name =“foos”)和@XmlElement(name =“foo”)进行注释.
当我解组没有< foos>< / foos>的XML时或< foo />元素,调用setter并传递一个空列表.有没有办法得到以下?:
>如果没有< foos />,请不要调用setter.或者如果必须调用setter,则传递null.
>当< foos />存在但空,将空列表传递给setter.
>当< foos>有一个或多个孩子< foo />元素,传递填充列表.
解决方法:
您可以在此用例中使用XmlAdapter:
input1.xml
When there is no , do not call
the setter. Or if the setter must be
called, pass null.
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child/>
</root>
input2.xml
When is present but empty,
pass an empty list to the setter.
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>
<foos/>
</child>
</root>
input3.xml
When has one or more child
elements, pass a populated
list.
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>
<foos>
<foo>Hello World</foo>
</foos>
</child>
</root>
根
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
public class Root {
private Child child;
@XmlJavaTypeAdapter(ChildAdapter.class)
public Child getChild() {
return child;
}
public void setChild(Child child) {
this.child = child;
}
}
儿童
import java.util.List;
public class Child {
private List<String> strings;
public List<String> getStrings() {
return strings;
}
public void setStrings(List<String> strings) {
System.out.println("setStrings");
this.strings = strings;
}
}
ChildAdapter
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class ChildAdapter extends XmlAdapter<ChildAdapter.AdaptedChild, Child> {
public static class AdaptedChild {
public Foos foos;
}
public static class Foos {
public List<String> foo;
}
@Override
public Child unmarshal(AdaptedChild adaptedChild) throws Exception {
Child child = new Child();
Foos foos = adaptedChild.foos;
if(null != foos) {
List<String> foo = foos.foo;
if(null == foo) {
child.setStrings(new ArrayList<String>());
} else {
child.setStrings(foos.foo);
}
}
return child;
}
@Override
public AdaptedChild marshal(Child child) throws Exception {
AdaptedChild adaptedChild = new AdaptedChild();
List<String> strings = child.getStrings();
if(null != strings) {
Foos foos = new Foos();
foos.foo = strings;
adaptedChild.foos = foos;
}
return adaptedChild;
}
}
演示
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Object o;
o = unmarshaller.unmarshal(new File("input1.xml"));
marshaller.marshal(o, System.out);
o = unmarshaller.unmarshal(new File("input2.xml"));
marshaller.marshal(o, System.out);
o = unmarshaller.unmarshal(new File("input3.xml"));
marshaller.marshal(o, System.out);
}
}
产量
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child/>
</root>
setStrings
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>
<foos/>
</child>
</root>
setStrings
<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>
<foos>
<foo>Hello World</foo>
</foos>
</child>
</root>
标签:java,jaxb,moxy 来源: https://codeday.me/bug/20190903/1797146.html