当前位置: 首页 > 知识库问答 >
问题:

JAXB xsi:类型子类解组无效

岳承悦
2023-03-14

下面是这篇经常被引用的博客文章中关于使用xsi:type的说明:

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,并基于此缺陷,尝试了JAXB-impl-2.2.6-b38。罐子这些都不管用。

这是不应该工作,还是我错过了一些设置?

共有1个答案

姜宏放
2023-03-14

测试用例中,您需要指定DocumentBuilderFactory是名称空间感知的。如果没有此设置,JAXB实现的DOM输入将不会包含格式正确的xsi:type属性。

    documentBuilderFactory.setNamespaceAware(true);
 类似资料:
  • 问题内容: 我有一些代码已经被转储并实际上被卡住了-之前我已经使用过RPC和JSON方面的东西,但是当它在本地运行良好时,我似乎无法使其在RPC上正常工作。 (也在这里,但没有可用的TCP!http: //play.golang.org/p/HmK-K09D2J ) 输出令人惊讶,因为它表明编组而不是实际数据出了点问题- 在Wireshark中运行它,我可以看到数据以正确的格式发送(我在另一个问题

  • 问题内容: 这是我得到的错误: 这是我的代码: 另外,我在一个单独的类中声明了这一点: 是什么导致此错误,我该如何解决? 编辑:缩进,空格,命名约定和可读性问题已得到解决。 问题答案: 问题在于,这似乎是一个内部类(很难说,您的缩进是不好的),并且由于它不是静态的,因此您无法单独实例化它。 您要么需要自己创建一个类,要么使其成为一个类并将其实例化为(或者无论父类是什么,您的缩进在这里实际上都没有帮

  • 编辑:OK,在typescript规范中有详细说明:类型断言

  • 我有这样一个功能组件:

  • 问题内容: 我得到以下数据: 通过websocket,我想将其解组到 使用以下命令解组它: 但我不断收到错误: json:无法将字符串解组到类型为feed.OrderBookItem的Go结构字段OrderBookResult.bids中 当我将结构更改为 有用。我希望将它们定义为它们是什么。我必须改变什么? 问题答案: 如错误所示: json:无法将字符串解组到类型为feed.OrderBook