JAXB xsi:类型子类unmarshalling不起作用 [英] JAXB xsi:type subclass unmarshalling not working
问题描述
我正在按照这个经常被引用的博客文章使用xsi:type的说明:
I'm following the instructions on using xsi:type from this oft-cited blog post:
http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.html
基本上我有这个:
public abstract class ContactInfo {
}
public class Address extends ContactInfo {
private String street;
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
@XmlRootElement
public class Customer {
private ContactInfo contactInfo;
public ContactInfo getContactInfo() {
return contactInfo;
}
public void setContactInfo(ContactInfo contactInfo) {
this.contactInfo = contactInfo;
}
}
此测试:
@Test
public void contactTestCase() throws JAXBException, ParserConfigurationException, IOException, SAXException {
Customer customer = new Customer();
Address address = new Address();
address.setStreet("1 A Street");
customer.setContactInfo(address);
JAXBContext jc = JAXBContext.newInstance(Customer.class, Address.class, PhoneNumber.class);
StringWriter writer = new StringWriter();
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(customer, writer);
String s = writer.toString();
System.out.append(s);
StringInputStream sis = new StringInputStream(s);
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = documentBuilderFactory.newDocumentBuilder();
Document doc = db.parse(sis);
Unmarshaller um = jc.createUnmarshaller();
JAXBElement result = um.unmarshal(doc, Customer.class);
Customer f = (Customer) result.getValue();
writer = new StringWriter();
marshaller.marshal(customer, writer);
s = writer.toString();
System.out.append(s);
}
我得到这个结果:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer>
<contactInfo xsi:type="address" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<street>1 A Street</street>
</contactInfo>
</customer>
javax.xml.bind.UnmarshalException: Unable to create an instance of blog.inheritance.ContactInfo
我已经尝试了JAXB的默认实现,jaxb-impl-2.1.2并基于此 bug ,我试过jaxb-impl-2.2.6-b38.jar。它都不起作用。
I've tried the default implementation of JAXB, jaxb-impl-2.1.2 and based off this bug, I've tried jaxb-impl-2.2.6-b38.jar. None of it works.
这不应该工作还是我错过了一些设置?
Is this not supposed to work or am I missing some setup?
推荐答案
在您的测试用例中,您需要指定 DocumentBuilderFactory
是否可识别名称空间。如果没有此设置,JAXB实现的DOM输入将不包含正确形成的 xsi:type
属性。
In your test case you need to specify that the DocumentBuilderFactory
is namespace aware. Without this setting the DOM input to your JAXB implemenation won't contain a properly formed xsi:type
attribute.
documentBuilderFactory.setNamespaceAware(true);
这篇关于JAXB xsi:类型子类unmarshalling不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!