2009-07-21 38 views
6

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 {} 
} 

Trả lời

1

Đây là một bug đã được sửa trong JAXB 2.1.13. Cập nhật thư viện của bạn hoặc sử dụng JDK 1.7 trở lên và vấn đề sẽ được giải quyết.

0

Khi tôi chạy chương trình thử nghiệm của bạn với jdk1.6.0_20 nó xuất hiện để làm việc và tôi nhận được kết quả như sau:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<zoo><animals><dog/><cat/></animals></zoo> 
it worked 
+0

Phiên bản JAXB nào? – codefinger

+0

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 –

0

Bạn đã thử đưa chú thích vào phụ kiện của mình chưa? Tôi cũng đã có vấn đề này với @XmlElementWrapper trước nhưng tôi đã nhận nó được giải quyết bằng cách đặt chú thích getter của tôi thay vì chú thích khai báo trường.

8

có nên sử dụng @XmlElementRefs ({ @XmlElementRef (type = Dog.class), @XmlElementRef (type = Cat.class)}) động vật Danh sách tư nhân;

hoặc sử dụng @XmlAnyElement (lỏng lẻo = true) mà thôi, và thêm Dog.class, Cat.class để JaxbContext

0

Khi tôi chạy chương trình thử nghiệm của bạn với jdk1.6.0_20 nó không hoạt động, tuy nhiên một khi tôi đã thay đổi chú thích cho danh sách từ @XmlAnyElement(lax = true) thành @XmlElementRefs({ @XmlElementRef(type=Dog.class), @XmlElementRef(type=Cat.class)}) thì nó sẽ hoạt động. Không quan trọng là Dog.classCat.class được thêm vào JAXBCtext hay không.

Các vấn đề liên quan