Tôi đang sử dụng JAXB để đọc và viết XML. Những gì tôi muốn là sử dụng một lớp JAXB cơ sở cho marshalling và một lớp JAXB được thừa hưởng cho unmarshalling. Điều này là để cho phép một ứng dụng Java của người gửi gửi XML tới một ứng dụng Java nhận khác. Người gửi và người nhận sẽ chia sẻ một thư viện JAXB chung. Tôi muốn người nhận unmarshall XML vào một lớp JAXB người nhận cụ thể mở rộng lớp JAXB chung.Thừa kế JAXB, không đối sánh với lớp con của lớp được sắp xếp thứ tự
Ví dụ:
Đây là lớp JAXB thường được người gửi sử dụng.
@XmlRootElement(name="person")
public class Person {
public String name;
public int age;
}
Đây là lớp JAXB cụ thể của người nhận được sử dụng khi unmarshalling XML. Lớp người nhận có logic cụ thể cho ứng dụng người nhận.
@XmlRootElement(name="person")
public class ReceiverPerson extends Person {
public doReceiverSpecificStuff() ...
}
Thao tác Marshall hoạt động như mong đợi. Vấn đề là với unmarshalling, nó vẫn unmarshals để Person
bất chấp JAXBContext sử dụng tên gói của subclassed ReceiverPerson
.
JAXBContext jaxbContext = JAXBContext.newInstance(package name of ReceiverPerson);
Điều tôi muốn là unmarshall thành ReceiverPerson
. Cách duy nhất tôi có thể thực hiện việc này là xóa @XmlRootElement
từ Person
. Thật không may làm điều này ngăn không cho Person
bị trùng hợp. Nó giống như JAXB bắt đầu ở lớp cơ sở và làm việc theo cách của nó xuống cho đến khi nó tìm thấy @XmlRootElement
đầu tiên với tên thích hợp. Tôi đã thử thêm phương thức createPerson()
trả về ReceiverPerson
đến ObjectFactory
nhưng không hiệu quả.
Tôi đã thử điều này và nó không hoạt động. Không có vấn đề gì tôi cố gắng, ObjectFactory hoặc XmlAdapter của tôi không bao giờ được gọi. Từ những gì tôi đã đọc JAXB của Sun giải quyết thông qua các tham chiếu lớp tĩnh. Có vẻ như việc triển khai Glassfish có nhiều hứa hẹn hơn https://jaxb.dev.java.net/guide/Adding_behaviors.html –
XmlJavaAdapters phù hợp để làm cho các lớp không được chú thích JAXB có thể sử dụng được với JAXB. Bởi vì Person và ReceiverPerson (và/hoặc superlass của họ, nếu có) có chú thích JAXB, nó không hoạt động. Bạn cần Người và Người nhận không có JAXB, cộng với bộ điều hợp cho cả hai. –
Bạn đã thử đổi kiểu cho marshall | unmarshall? [...] mở rộng XmlAdapter [...] @Override công khai Người nhận không trùng hợp (Người v) { trả lại Người nhận mới (v); } @Override người công khai soái (Người nhận v) { trả lại v; } –