我正在尝试使用JAXB解组一些XML,但出现“无法创建…的实例”异常。我知道为什么- 它试图建立一个抽象类的实例。我想要的是让它成为特定实现类的实例。我的目标是对setter方法进行特定于类的检查。对于BarImpl,也许“ qux”是有效的baz值,但BarImpl2想要做其他事情。
我没有通过注释Foo来实现这一目标,但是如果我不注释bar,事情就会变得很丑。
import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; 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)); } @XmlRootElement(name="foo") public static abstract class Foo { @XmlElement(name="bar") Bar bar; } @XmlRootElement(name="bar") public static abstract class Bar { @XmlElement(name="baz") String baz; } public static class FooImpl extends Foo { } public static class BarImpl extends Bar { } }
您可以执行以下操作:
@XmlRootElement
@XmlTransient
@XmlElement(type=BarImpl.class)
bar
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 { } }