2012-01-20 35 views
5

Có vẻ như có thể đối chiếu hai số khác nhaujaxb các đối tượng có cùng tên tên.Đối tượng Jaxb có cùng tên

Có một Bar lớp ...

public abstract Bar { 
    private @XmlElement String val; 
} 

.. với hai triển khai (nhà xây dựng, vv rời ra):

@XmlRootElement(name="bar") 
public class BarA extends Bar { } 

@XmlRootElement(name="bar") 
public class BarB extends Bar { 
    private @XmlElement(required=true) String type; 
} 

Cuối cùng tôi muốn unmarshall một danh sách các tài liệu từ Bar XML tương tự như sau

<bars> 
    <bar> 
    <val>1</val> 
    </bar> 
    <bar> 
    <val>1</val> 
    <type>2</type> 
    </bar> 
</bars> 

Danh sách được bao bọc pped trong một lớp học sử dụng các @XmlAnyElement

@XmlRootElement 
public class Bars { 

    @XmlMixed 
    @XmlAnyElement(lax = true) 
    @XmlElementRefs({@XmlElementRef(BarA.class), @XmlElementRef(BarB.class)}) 
    private List<Bar> bars; 
} 

Tuy nhiên tôi dường như chỉ lấy trường hợp của hoặcBarA hoặc BarB, lấy giá trị yếu tố cuối cùng trong chuỗi @XmlElementRefs.

kiểm tra mã:

String xml = ... 
JAXBContext jc = JAXBContext.newInstance(Bars.class); 
ByteArrayInputStream in = new ByteArrayInputStream(xml.getBytes()); 
Bars bars = (Bars) jc.createUnmarshaller().unmarshal(in); 
for (Bar bar : bars.getBars()) { 
    System.out.println(bar.getClass()); 
} 

Tôi không nghĩ rằng XmlAdapter đề xuất trong JAXB @XmlElements, different types but same name? neccesarily sẽ là phương pháp duy nhất một trong hai.

Trả lời

2

Thực sự, điều đầu tiên tôi sẽ cố gắng làm là xóa nguồn của sự cố - có hai lớp JAXB khác nhau có cùng tên. Một tình huống như thế chắc chắn sẽ gây đau đầu cho bạn và cho những người phải duy trì mã của bạn.

Nếu điều đó là không thể ... Có lẽ bạn có thể viết một phân lớp khác có tên là EveryBar, và luôn luôn unmarshall cho điều đó. EveryBar sẽ chứa tất cả các trường của mọi lớp con Bar khác. Sau đó, bạn sẽ có một bước hậu xử lý trên cây đối tượng của bạn mà sẽ kiểm tra EveryBar, và trao đổi nó cho một thể hiện của bất kỳ loại nào là thích hợp. Vâng, đó là một giải pháp xấu xí, nhưng nó chỉ hơi tồi tệ hơn một từ liên kết của bạn.

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