JAXB xsi:类型子类unmarshalling不起作用 [英] JAXB xsi:type subclass unmarshalling not working

查看:361
本文介绍了JAXB xsi:类型子类unmarshalling不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在按照这个经常被引用的博客文章使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆