Lưu ý: Tôi là người lãnh đạo EclipseLink JAXB (MOXy) và là thành viên của số JAXB 2 (JSR-222) nhóm chuyên gia.
Có một vài khía cạnh thú vị của trường hợp sử dụng của bạn:
- ArrayList như đối tượng gốc
- mối quan hệ hai chiều giữa
ObjReal
và ObjStruc
1. ArrayList AS ROOT OBJECT
Triển khai JAXB (MOXy, Metro, Ja xMe, vv) không cung cấp hỗ trợ trực tiếp để xử lý các loại Collection
làm đối tượng gốc. Để xử lý trường hợp sử dụng này, bạn chỉ cần tạo lớp bao bọc có trường mong muốn Collection
làm trường/thuộc tính.
@XmlRootElement(name="root-element-name")
@XmlAccessorType(XmlAccessType.FIELD)
public class ListWrapper {
private ArrayList<ObjReal> objReals;
}
2. hai chiều RELATIOSNHIP
Bạn có thể sử dụng phần mở rộng @XmlInverseReference
trong việc thực hiện EclipseLink của JAXB để xử lý các mối quan hệ hai chiều trong mô hình của bạn. Dưới đây tôi đã bao gồm một ví dụ hoàn chỉnh. Tôi đã bỏ qua hầu hết các phương thức truy cập để tiết kiệm không gian.
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
Các @XmlInverseReference
chú thích được sử dụng trên lớp này. Trên chú thích này, bạn chỉ định tên fied/tài sản cho một hướng khác của mối quan hệ:
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
Để xác định MOXY là nhà cung cấp JAXB của bạn, bạn cần phải bao gồm một tập tin gọi jaxb .properties với các nội dung sau đây trong cùng một gói như các lớp miền của bạn:
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Demo
Bạn có thể chạy các đoạn mã sau để xác minh các bản đồ:
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 (input.xml)
<?xml version="1.0" encoding="UTF-8"?>
<objReal>
<id>123</id>
<data>some data</data>
<objStrucs/>
<objStrucs/>
</objReal>
Output
Dưới đây là sản phẩm từ chạy mã trình diễn. Như bạn có thể thấy objReal
tài sản trên mỗi ObjStruc
đối tượng được dân cư trong unmarshal:
[email protected]
[email protected]
<?xml version="1.0" encoding="UTF-8"?>
<objReal>
<id>123</id>
<data>some data</data>
<objStrucs/>
<objStrucs/>
</objReal>
Để biết thêm thông tin
Tải EclipseLink
Bạn có thể tải EclipseLink tại địa chỉ:
Rất thú vị ... Tôi sẽ bỏ phiếu này! – aviad