有几件事需要检查:
- 你
JAXBContext
知道B
类吗?您可以包含在用于创建JAXBContext
或添加类@XmlSeeAlso({B.class})
的A
类中。
- 类型的名称是否与类
B
对应B
?默认情况下它将是b
. 您可以使用@XmlType
注释来指定名称。
一个
package forum13712986;
import javax.xml.bind.annotation.XmlSeeAlso;
@XmlSeeAlso({B.class})
public class A {
}
乙
package forum13712986;
import javax.xml.bind.annotation.XmlType;
@XmlType(name="B") // Default name is "b"
public class B extends A {
}
演示
package forum13712986;
import java.io.StringReader;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(A.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
String xml = "<A xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='B'/>";
StreamSource source = new StreamSource(new StringReader(xml));
JAXBElement<A> jaxbElement = unmarshaller.unmarshal(source, A.class);
System.out.println(jaxbElement.getValue().getClass());
}
}
输出
class forum13712986.B