Tôi đang gặp sự cố với chú thích JAXB cho trường là danh sách có loại được phân loại là giao diện. Khi tôi tuyên bố nó như:Chú thích JAXB - Ánh xạ giao diện và @XmlElementWrapper
@XmlAnyElement
private List<Animal> animals;
Mọi thứ đều hoạt động chính xác. Nhưng khi tôi thêm phần tử trình bao bọc, chẳng hạn như:
@XmlElementWrapper
@XmlAnyElement
private List<Animal> animals;
Tôi thấy đối tượng Java sắp xếp chính xác, nhưng khi tôi sửa đổi tài liệu được tạo bởi marshaling, danh sách của tôi trống. Tôi đã đăng bên dưới mã để chứng minh vấn đề này.
Tôi đang làm điều gì đó sai, hoặc đây có phải là lỗi không? Tôi đã thử nó với phiên bản 2.1.12 và 2.2-ea với cùng một kết quả.
Tôi đang làm việc thông qua các ví dụ cho các giao diện lập bản đồ với các chú thích nằm ở đây: https://jaxb.dev.java.net/guide/Mapping_interfaces.html
@XmlRootElement
class Zoo {
@XmlElementWrapper
@XmlAnyElement(lax = true)
private List<Animal> animals;
public static void main(String[] args) throws Exception {
Zoo zoo = new Zoo();
zoo.animals = new ArrayList<Animal>();
zoo.animals.add(new Dog());
zoo.animals.add(new Cat());
JAXBContext jc = JAXBContext.newInstance(Zoo.class, Dog.class, Cat.class);
Marshaller marshaller = jc.createMarshaller();
ByteArrayOutputStream os = new ByteArrayOutputStream();
marshaller.marshal(zoo, os);
System.out.println(os.toString());
Unmarshaller unmarshaller = jc.createUnmarshaller();
Zoo unmarshalledZoo = (Zoo) unmarshaller.unmarshal(new ByteArrayInputStream(os.toByteArray()));
if (unmarshalledZoo.animals == null) {
System.out.println("animals was null");
} else if (unmarshalledZoo.animals.size() == 2) {
System.out.println("it worked");
} else {
System.out.println("failed!");
}
}
public interface Animal {}
@XmlRootElement
public static class Dog implements Animal {}
@XmlRootElement
public static class Cat implements Animal {}
}
Phiên bản JAXB nào? – codefinger
Tôi đang sử dụng phiên bản JAXB 2.1 đi kèm với jdk1.6.0_20. Bạn cũng có thể thử ví dụ của mình với MOXy JAXB (tôi là người dẫn đầu công nghệ). Chúng tôi đã khắc phục lỗi liên quan đến câu hỏi của bạn, bạn sẽ cần sử dụng bản tải xuống đêm hôm nay (ngày 4 tháng 11) hoặc sau này của EclipeseLink 2.2.0: http://www.eclipse.org/eclipselink/downloads/nightly.php –