JAXB and abstract classes

后端 未结 1 1530
死守一世寂寞
死守一世寂寞 2020-12-31 14:43

I\'m trying to use JAXB to unmarshall some XML, but I\'m getting an \"Unable to create an instance of...\" exception. I understand why--it\'s trying to make an instance of

1条回答
  •  别那么骄傲
    2020-12-31 15:23

    You could do the following:

    • Annotation the impl classes with @XmlRootElement instead of the abstract classes.
    • Mark the abstract classes with @XmlTransient (see http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html)
    • Use @XmlElement(type=BarImpl.class) on the bar property to specify the concrete type (see http://blog.bdoughan.com/2011/05/jaxb-and-interface-fronted-models.html).

    JAXBTest

    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 = 
                "" +
                "  " +
                "    qux" +
                "  " +
                "";
    
            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 { }
    }
    

    0 讨论(0)
提交回复
热议问题