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;
    }

}