Is it possible to programmatically configure JAXB?

前端 未结 1 991
小蘑菇
小蘑菇 2020-11-27 08:26

Say I have two JavaBeans Person and Address.

If I create a list of Person objects, I\'d like to marshal to something like this:



        
相关标签:
1条回答
  • 2020-11-27 08:35

    You could create a generic Wrapper object like the following:

    Wrapper

    You could create a generic wrapper class with a List property annotated with @XmlAnyElement(lax=true). The type of the object used to populate this list will be based on its root element (see: http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html).

    package forum13272288;
    
    import java.util.*;
    import javax.xml.bind.annotation.XmlAnyElement;
    
    public class Wrapper<T> {
    
        private List<T> items = new ArrayList<T>();
    
        @XmlAnyElement(lax=true)
        public List<T> getItems() {
            return items;
        }
    
    }
    

    Address

    You will need to annotate the possible contents of the list with @XmlRootElement.

    package forum13272288;
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement
    public class Address {
    
    }
    

    Person

    package forum13272288;
    
    import javax.xml.bind.annotation.XmlRootElement;
    
    @XmlRootElement
    public class Person {
    
    }
    

    Demo

    The demo code below demonstrates how to use the Wrapper class. Since the root element can be different you will need to specify that you want to unmarshal to the wrapper class. Alternatively you could leverage the @XmlElementDecl annotation to associate multiple root elements with the wrapper class (see: http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html).

    package forum13272288;
    
    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(Wrapper.class, Person.class, Address.class);
            Unmarshaller unmarshaller = jc.createUnmarshaller();
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    
            StreamSource personsXML = new StreamSource("src/forum13272288/persons.xml");
            JAXBElement<Wrapper> wrapper1 = unmarshaller.unmarshal(personsXML, Wrapper.class);
            marshaller.marshal(wrapper1, System.out);
    
            StreamSource addressesXML = new StreamSource("src/forum13272288/addresses.xml");
            JAXBElement<Wrapper> wrapper2 = unmarshaller.unmarshal(addressesXML, Wrapper.class);
            marshaller.marshal(wrapper2, System.out);
        }
    
    }
    

    Output

    Below is the output from running the demo code. The files persons.xml and addresses.xml look just like there corresponding output.

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <persons>
        <person/>
        <person/>
    </persons>
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <addresses>
        <address/>
        <address/>
    </addresses>
    

    For More Information

    • http://blog.bdoughan.com/2012/11/creating-generic-list-wrapper-in-jaxb.html
    0 讨论(0)
提交回复
热议问题