您可以执行以下操作:
- 用
@XmlRootElement
代替抽象类来注释impl 类。 - 用标记抽象类
@XmlTransient
(请参见http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html) - 用于
@XmlElement(type=BarImpl.class)
在bar
属性上指定具体类型(请参见http://blog.bdoughan.com/2011/05/jaxb-and-interface-fronted-models.html)。
JAXB测试
import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlElements;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.bind.annotation.XmlTransient;import org.junit.Test;public class JAXBTest { @Test public void test() throws javax.xml.bind.JAXBException { String xml = "<foo>" + " <bar>" + " <baz>qux</baz>" + " </bar>" + "</foo>"; javax.xml.bind.JAXBContext context = javax.xml.bind.JAXBContext.newInstance( FooImpl.class, BarImpl.class ); javax.xml.bind.Unmarshaller unmarshaller = context.createUnmarshaller(); unmarshaller.unmarshal(new java.io.StringReader(xml)); } @XmlTransient public static abstract class Foo { @XmlElements({ @XmlElement(name="bar",type=BarImpl.class), @XmlElement(name="bar",type=BarImpl2.class), }) Bar bar; } @XmlTransient public static abstract class Bar { @XmlElement(name="baz") String baz; } @XmlRootElement(name="foo") public static class FooImpl extends Foo { } @XmlRootElement(name="bar") public static class BarImpl extends Bar { } public static class BarImpl2 extends Bar { }}


