JaxB наследование, сортирующее абстрактные классы
Я искал лучший способ выполнить следующее действие, используя JaxB, но я не могу найти способ, который работает. Я следовал этому уроку, чтобы учесть маршалинг и демаршалинг подклассов.
Он достигает всего, что я ищу, за исключением того, что для того, чтобы подклассы были правильно маршалированы и не маршалированы, они должны быть обернуты в класс с определенным @XmlRootElement
, Это не позволяет вам представлять сами классы как Xml самостоятельно.
Я хочу, чтобы классы были такими:
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlJavaTypeAdapter(ContactMethodAdapter.class)
public abstract class ContactMethod {
}
public class Address extends ContactMethod {
protected String street;
protected String city;
}
public class PhoneNumber extends ContactMethod {
protected String number;
}
и я хочу иметь возможность выполнить следующее:
Входные данные:
<contact-method>
<street>Broadway</street>
<city>Seattle</city>
</contact-method>
Главный:
public class Demo {
public static void main(String[] args) throws Exception {
ContactMethod meth = (ContactMethod ) unmarshaller.unmarshal(xml);
if(ContactMethod instanceof Address){
Address addr = (Address) meth;
addr.getStreet();
// etc.
}
Address marshalAddr = new Address("Broadway", "Seattle");
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal((ContactMethod) marshalAddr, System.out);
}
}
Выход:
<contact-method>
<street>Broadway</street>
<city>Seattle</city>
</contact-method>
Кто-нибудь знает, как это можно сделать?
1 ответ
В итоге я использовал один класс (AdaptedContactMethod) для моделирования абстрактного класса. Затем я выполнял маршалинг и демаршаллинг для различных подклассов самостоятельно, а не через @XmlJavaTypeAdapter
,
Это позволяет вам поставить @XmlRootElement
в вашей реализации AdaptedContactMethod без необходимости заключать его в список.