JAXB:使用 XmlIDREF 的编组列表实现

问题描述

在编组 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 (将#修改为@)