java - JAXB 解码 XML 类转换异常

标签 java xml xml-parsing jaxb

我正在使用这个 JAXB Collection Generics解码我的字符串 xml 并返回列表类型。 这是我使用的方法。

public static <T> List<T> unmarshalCollection(Class<T> cl, String s)
        throws JAXBException {
    return unmarshalCollection(cl, new StringReader(s));
}

public static <T> List<T> unmarshalCollection(Class<T> cl, Reader r)
        throws JAXBException {
    return unmarshalCollection(cl, new StreamSource(r));
}


private static <T> List<T> unmarshalCollection(Class<T> cl, Source s)
        throws JAXBException {
    JAXBContext ctx = JAXBContext.newInstance(JAXBCollection.class, cl);
    Unmarshaller u = ctx.createUnmarshaller();
    JAXBCollection<T> collection = u.unmarshal(s, JAXBCollection.class).getValue();
    return collection.getItems();
}

示例 getter 和 setter:

   @XmlRootElement(name = "person")
class Person{

    private String firstName;
    private String lastName;
    private String address;


    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Person [firstName ="+firstName+" , lastName = "+lastName+" , address = "+address+"]"; 
    }

}

主类:

public static void main(String[] args) throws JAXBException {
        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><person><firstName>Foo</firstName><lastName>Bar</lastName><address>U.S</address></person>";
        List<Person> p = unmarshalCollection(Person.class,xml);
        for(Person person : p ){
            System.out.println(person);
        }
    }

抛出异常

Exception in thread "main" java.lang.ClassCastException: org.apache.xerces.dom.ElementNSImpl cannot be cast to  com.Person
at com.JAXBUtil.main(JAXBUtil.java:62)

我做错了什么?有什么想法吗?谢谢。

最佳答案

您的列表不是您期望的 Person 对象列表。由于 java 的泛型类型删除,在尝试强制转换为循环中的人员之前,您不会看到错误。

尝试:

List<Person> p = unmarshalCollection(Person.class,xml);
for(Object person : p ){
   System.out.println(person.getClass());
}

参见 http://en.wikipedia.org/wiki/Generics_in_Java#Problems_with_type_erasure

关于java - JAXB 解码 XML 类转换异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25324218/

相关文章:

java - Xalan DTMManager.newInstance 性能问题

java - 如何在 Java 中指定要使用的打印机?

java - Scala 重载不选择最具体的方法

java - android 中关于 xml 文件的错误。找不到与给定名称 @text 匹配的资源

android - 如何在另一个图像之上获得半透明图像以在 android 中保存文本(提供的屏幕截图)

java - 如何解析无效(错误/格式不正确)的 XML?

java - 将 Blockly 生成的 XML 代码解析为 Java 对象

c# - 解析XML文件的节点

java - 将对象数组传递给方法

java - 在哪里可以将 google-play-services-ads.jar 包含到我的项目中?