Примечание: Я EclipseLink JAXB (MOXy) и являюсь членом JAXB 2 (JSR-222 ) экспертная группа.
В вашем случае есть пара интересных аспектов:
- ArrayList в качестве корневого объекта
- Двунаправленная связь между
ObjReal
и ObjStruc
1. ARRAYLIST КАК ОБЪЕКТ КОРНИ
Реализации JAXB (MOXy, Metro, JaxMe и т. Д.) Не предоставляют прямой поддержки для обработки типов Collection
как корневых объектов. Чтобы справиться с этим вариантом использования, вам просто нужно создать класс-оболочку с желаемым Collection
в качестве поля / свойства.
@XmlRootElement(name="root-element-name")
@XmlAccessorType(XmlAccessType.FIELD)
public class ListWrapper {
private ArrayList<ObjReal> objReals;
}
2. Двунаправленное отношение
Вы можете использовать расширение @XmlInverseReference
в реализации EclipseLink JAXB для обработки двунаправленных отношений в вашей модели. Ниже я включил полный пример. Я опустил большинство методов доступа для экономии места.
ObjReal
import java.util.ArrayList;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
class ObjReal {
private String id;
private String data;
ArrayList<ObjStruc> objStrucs=new ArrayList<ObjStruc>();
public ArrayList<ObjStruc> getObjStrucs() {
return objStrucs;
}
}
ObjStruc
В этом классе используется аннотация @XmlInverseReference
. В этой аннотации вы указываете имя fied / свойства для другого направления отношения:
import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.XmlInverseReference;
@XmlAccessorType(XmlAccessType.FIELD)
class ObjStruc {
@XmlInverseReference(mappedBy="objStrucs")
private ObjReal objReal;
public ObjReal getObjReal() {
return objReal;
}
}
jaxb.properties
Чтобы указать MOXy в качестве вашего JAXB-провайдера, вам нужно включить файл с именем jaxb.properties со следующим содержимым в том же пакете, что и классы вашего домена:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Демо
Вы можете запустить следующий код для проверки соответствия:
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(ObjReal.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum8868303/input.xml");
ObjReal objReal = (ObjReal) unmarshaller.unmarshal(xml);
for(ObjStruc objStruc : objReal.getObjStrucs()) {
System.out.println(objStruc.getObjReal());
}
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(objReal, System.out);
}
}
Ввод (input.xml)
<?xml version="1.0" encoding="UTF-8"?>
<objReal>
<id>123</id>
<data>some data</data>
<objStrucs/>
<objStrucs/>
</objReal>
выход
Ниже приведен результат запуска демонстрационного кода. Как вы можете видеть, свойство objReal
для каждого из объектов ObjStruc
было заполнено во время демаршала:
forum8868303.ObjReal@7f712b3a
forum8868303.ObjReal@7f712b3a
<?xml version="1.0" encoding="UTF-8"?>
<objReal>
<id>123</id>
<data>some data</data>
<objStrucs/>
<objStrucs/>
</objReal>
Для получения дополнительной информации
Загрузить EclipseLink
Вы можете скачать EclipseLink по адресу: