问题描述
在编组 ArrayList
的自定义实现时遇到问题。 ArrayList
项在属性上有一个 @XmlID
注释,在这个特定实例中,我希望它们使用 @XmlIDREF
进行编组,因此通过 ID。有没有办法通过 JAXB 注释来实现这一点,或者我是否需要 this thread 中所示的 XmlAdapter
?如果是这样,对适配器的更改需要什么?
示例
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
public class Main
{
public static void main(String[] args) throws Exception {
POJO1 pojo11 = new POJO1("pojo11",1.0);
POJO1 pojo12 = new POJO1("pojo12",2.0);
POJO1 pojo13 = new POJO1("pojo13",3.0);
POJO2 pojo21 = new POJO2();
pojo21.add(pojo11);
pojo21.add(pojo12);
POJO2 pojo22 = new POJO2();
pojo22.add(pojo12);
pojo22.add(pojo13);
ArrayList<POJO2> pojo2s = new ArrayList<>(2);
pojo2s.add(pojo21);
pojo2s.add(pojo22);
POJO3 pojo3 = new POJO3(pojo2s);
JAXBContext jc = JAXBContext.newInstance(POJO3.class);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
marshaller.marshal(pojo3,System.out);
}
}
我希望输出类似于
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pojo3>
<items>
<item pojo11/>
<item pojo12/>
</items>
<items>
<item pojo12/>
<item pojo13/>
</items>
</pojo3>
相反,我只得到
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<pojo3>
<items>
<items/>
<items/>
</items>
</pojo3>
MWE
POJO1:
import javax.xml.bind.annotation.XmlAccesstype;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlID;
import javax.xml.bind.annotation.XmlRootElement;
// JAXB
@XmlRootElement
@XmlAccessorType(XmlAccesstype.FIELD)
public class POJO1
{
@XmlAttribute
@XmlID
private String name;
private double value;
public POJO1() {
}
public POJO1(String name,double value) {
this.name = name;
this.value = value;
}
public void setName(String v) {this.name = v;}
public String getName() {return name;}
public void setValue(double v) {this.value = v;}
public double getValue() {return value;}
}
POJO2:
import java.util.ArrayList;
import java.util.Collection;
import javax.xml.bind.annotation.XmlAccesstype;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
// JAXB
@XmlRootElement
@XmlAccessorType(XmlAccesstype.FIELD)
public class POJO2
extends
ArrayList<POJO1>
{
public POJO2(int initialCapacity) {
super(
initialCapacity
);
}
public POJO2() {
super();
}
public POJO2(Collection<POJO1> c) {
super(
c
);
}
}
POJO3:
import java.util.Collection;
import javax.xml.bind.annotation.XmlAccesstype;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
// JAXB
@XmlRootElement
@XmlAccessorType(XmlAccesstype.FIELD)
public class POJO3
{
@XmlElementWrapper
@XmlElement(name="items")
private Collection<POJO2> items;
public POJO3() {
}
public POJO3(Collection<POJO2> item) {
this.items = item;
}
public void setItems(Collection<POJO2> v) {this.items = v;}
public Collection<POJO2> getItems() {return items;}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)