Java 将多个子JAXBElement放入父JAXBElement
以下代码起作用:Java 将多个子JAXBElement放入父JAXBElement,java,jaxb,Java,Jaxb,以下代码起作用: private List<Object> custom; @XmlAnyElement public List<Object> getCustom() { if (custom == null) { custom = new ArrayList<>(); final JAXBElement<String> lv2elem = new JAXBElement<
private List<Object> custom;
@XmlAnyElement
public List<Object> getCustom() {
if (custom == null) {
custom = new ArrayList<>();
final JAXBElement<String> lv2elem =
new JAXBElement<String>(new QName("lv2"), String.class, "val1");
final JAXBElement lv1elem =
new JAXBElement(new QName("lv1"), JAXBElement.class, lv2elem);
custom.add(lv1elem);
}
return custom;
}
最后,我想创建一个带有动态标记的深层XML结构
我试图将不同的declaredType
和value
传递给lv1elem
的构造函数,但运气不佳:
// class [Ljavax.xml.bind.JAXBElement; nor any of its super class is known to this context.
lv1elem = new JAXBElement(new QName("lv1"), JAXBElement.class, new JAXBElement[] { lv2elem });
// [Ljavax.xml.bind.JAXBElement; is not known to this context
lv1elem = new JAXBElement(new QName("lv1"), JAXBElement[].class, new JAXBElement[] { lv2elem });
// class java.util.Arrays$ArrayList nor any of its super class is known to this context.
lv1elem = new JAXBElement(new QName("lv1"), JAXBElement.class, Arrays.asList(new JAXBElement[] { lv2elem } ));
通过使用中间JavaBean
Recurse
找到了一个变通方法,该java bean的属性类型为List
。我仍然需要使用JAXBElement
包装recurse
,将标记名从默认的
更改为所需的:
。recurse
中的列表可以包含一个或多个JAXBElement
,包括其他JAXBElement
或JAXB上下文已知的其他类型
public class Recurs {
private List<Object> custom;
@XmlAnyElement
public List<Object> getCustom() {
if (custom == null) {
custom = new ArrayList<>();
}
return custom;
}
public void setCustom(List<Object> custom) {
this.custom = custom;
}
}
@XmlRootElement
@XmlSeeAlso({ Recurs.class }) // !!! This is important
public class Xml {
private List<Object> custom;
@XmlAnyElement
public List<Object> getCustom() {
if (custom == null) {
custom = new ArrayList<>();
JAXBElement<String> lv2elem;
Recurs recurs = new Recurs();
for (int i = 1; i <= 2; i++) {
lv2elem = new JAXBElement<String>(new QName("lv2"), String.class, "val" + i);
recurs.getCustom().add(lv2elem);
}
JAXBElement lv1elem = new JAXBElement(new QName("lv1"), Recurs.class, recurs);
custom.add(lv1elem);
}
return custom;
}
}
公共类递归{
私人名单定制;
@XmlAnyElement
公共列表getCustom(){
如果(自定义==null){
自定义=新的ArrayList();
}
退货习惯;
}
公共void setCustom(列表自定义){
这个习惯=习惯;
}
}
@XmlRootElement
@XMLSEEALSE({Recurs.class})/!!!这很重要
公共类Xml{
私人名单定制;
@XmlAnyElement
公共列表getCustom(){
如果(自定义==null){
自定义=新的ArrayList();
JAXBElement lv2elem;
递归=新的递归();
对于(int i=1;i
// class [Ljavax.xml.bind.JAXBElement; nor any of its super class is known to this context.
lv1elem = new JAXBElement(new QName("lv1"), JAXBElement.class, new JAXBElement[] { lv2elem });
// [Ljavax.xml.bind.JAXBElement; is not known to this context
lv1elem = new JAXBElement(new QName("lv1"), JAXBElement[].class, new JAXBElement[] { lv2elem });
// class java.util.Arrays$ArrayList nor any of its super class is known to this context.
lv1elem = new JAXBElement(new QName("lv1"), JAXBElement.class, Arrays.asList(new JAXBElement[] { lv2elem } ));
public class Recurs {
private List<Object> custom;
@XmlAnyElement
public List<Object> getCustom() {
if (custom == null) {
custom = new ArrayList<>();
}
return custom;
}
public void setCustom(List<Object> custom) {
this.custom = custom;
}
}
@XmlRootElement
@XmlSeeAlso({ Recurs.class }) // !!! This is important
public class Xml {
private List<Object> custom;
@XmlAnyElement
public List<Object> getCustom() {
if (custom == null) {
custom = new ArrayList<>();
JAXBElement<String> lv2elem;
Recurs recurs = new Recurs();
for (int i = 1; i <= 2; i++) {
lv2elem = new JAXBElement<String>(new QName("lv2"), String.class, "val" + i);
recurs.getCustom().add(lv2elem);
}
JAXBElement lv1elem = new JAXBElement(new QName("lv1"), Recurs.class, recurs);
custom.add(lv1elem);
}
return custom;
}
}