JAXB, как вложить несколько объектов? - PullRequest
0 голосов
/ 08 апреля 2019

Я пытался найти, как это сделать, но я не нашел ответа на свои точные требования:

Допустим, у нас было 3 класса:

public class Main {
    public ArrayList<MyFirstClass> myFirstClass;
}

class MyFirstClass {
    public int num;
    public MySecondClass mySecondClass;
}

class MySecondClass {
    public String otherStr;
    public MyThirdClass myThirdClass;
}

class MyThirdClass {
    public int otherNum;
}

Я хочу иметь возможность читать эти XML с помощью unmarshaller:

<Main>
    <MyFirstClasses>
        <MyFirstClass>
            <num>1</num>
            <MySecondClass>
                <str>Hello</str>
                <MyThirdClass>
                    <otherNum>2</otherNum>
                </MyThirdClass>
            </MySecondClass>
        </MyFirstClass>
    <MyFirstClasses>
</Main>

Где я в основном могу установить переменные, которые являются объектами (MySecond / Third Class).

Я знаюЯ могу использовать @XMLRootElement, а затем @XmlElementWrapper(name="aName") и @XmlElement(name="aName"), чтобы сделать

<Main>
    <MyFirstClasses>
        <MyFirstClass>
            <num>1</num>
        </MyFirstClass>
    <MyFirstClasses>
</Main>

Но как я могу затем вложить MySecondClass в MyFirstClass, чтобы я мог установить его значения, потому что в противном случае FirstClassObject будет иметьMySecondClass с нулевыми значениями.

Заранее спасибо!

1 Ответ

2 голосов
/ 08 апреля 2019

Проблема в том, что ваш xml не совпадает с вашими POJO.Вы можете использовать аннотации, чтобы исправить это (переименование полей также будет работать).Попробуйте это:

@XmlRootElement(name = "Main")
public class Main {
    @XmlElementWrapper(name = "MyFirstClasses")
    @XmlElement(name = "MyFirstClass")
    private List<MyFirstClass> myFirstClass;
}

Затем FirstClass:

@XmlAccessorType(XmlAccessType.FIELD)
public class MyFirstClass {
    private int num;
    @XmlElement(name = "MySecondClass")
    private MySecondClass mySecondClass;
}

И MySecondClass:

@XmlAccessorType(XmlAccessType.FIELD)
public class MySecondClass {
    private String str;

    @XmlElement(name = "MyThirdClass")
    private MyThirdClass myThirdClass;
}

Наконец MyThirdClass:

@XmlAccessorType(XmlAccessType.FIELD)
public class MyThirdClass {
    public int otherNum;
}
...