parameter JAXBElement String

后端 未结 2 1166
死守一世寂寞
死守一世寂寞 2021-02-02 16:10

I\' have simple question about JAXB. Here is the sample code:

   //setter that has input JAXBElement
   b.setBIC(JAXBElement value);
相关标签:
2条回答
  • 2021-02-02 16:59

    We can do below to create the JAXBElement object: Just for others who may have this issue, for the example given b.setBIC(JAXBElement value); Lets assume that your class is ClassB and the object is b.

    b.setBIC(new JAXBElement(new QName(ClassB.class.getSimpleName()), ClassB.class, "StringToBeInitialized"));
    
    0 讨论(0)
  • 2021-02-02 17:07

    You can create an instance of JAXBElement directly or if you generated your Java model from an XML schema use a convience method on the generated ObjectFactory class.

    package org.example.schema;
    
    import javax.xml.bind.*;
    import javax.xml.namespace.QName;
    
    public class Demo {
    
        public static void main(String[] args) throws Exception {
            JAXBContext jc = JAXBContext.newInstance("org.example.schema");
    
            Root root = new Root();
    
            QName fooQName = new QName("http://www.example.org/schema", "foo");
            JAXBElement<String> fooValue = new JAXBElement<String>(fooQName, String.class, "FOO");
            root.setFoo(fooValue);
    
            ObjectFactory objectFactory = new ObjectFactory();
            JAXBElement<String> barValue = objectFactory.createRootBar("BAR");
            root.setBar(barValue);
    
            Marshaller marshaller = jc.createMarshaller();
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.marshal(root, System.out);
        }
    
    }
    

    schema.xsd

    The above demo code is based on a Java model generated from the following XML schema. The reason you get a JAXBElement<String> property in the first place is when you have an element that is both nillable="true" and minOccurs="0".

    <?xml version="1.0" encoding="UTF-8"?>
    <schema 
        xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.example.org/schema" 
        xmlns:tns="http://www.example.org/schema" 
        elementFormDefault="qualified">
        <element name="root">
            <complexType>
                <sequence>
                    <element name="foo" type="string" minOccurs="0" nillable="true"/>
                    <element name="bar" type="string" minOccurs="0" nillable="true"/>
                </sequence>
            </complexType>
        </element>
    </schema>
    

    Root

    The following class was generated from schema.xsd and contains properties like the one in your question.

    package org.example.schema;
    
    import javax.xml.bind.JAXBElement;
    import javax.xml.bind.annotation.*;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {"foo","bar"})
    @XmlRootElement(name = "root")
    public class Root {
    
        @XmlElementRef(name = "foo", namespace = "http://www.example.org/schema", type = JAXBElement.class)
        protected JAXBElement<String> foo;
        @XmlElementRef(name = "bar", namespace = "http://www.example.org/schema", type = JAXBElement.class)
        protected JAXBElement<String> bar;
    
        public JAXBElement<String> getFoo() {
            return foo;
        }
    
        public void setFoo(JAXBElement<String> value) {
            this.foo = value;
        }
    
        public JAXBElement<String> getBar() {
            return bar;
        }
    
        public void setBar(JAXBElement<String> value) {
            this.bar = value;
        }
    
    }
    

    ObjectFactory

    Below is the generated ObjectFactory class that contains convenience methods for creating the instances of JAXBElement.

    package org.example.schema;
    
    import javax.xml.bind.JAXBElement;
    import javax.xml.bind.annotation.*;
    import javax.xml.namespace.QName;
    
    @XmlRegistry
    public class ObjectFactory {
    
        private final static QName _RootFoo_QNAME = new QName("http://www.example.org/schema", "foo");
        private final static QName _RootBar_QNAME = new QName("http://www.example.org/schema", "bar");
    
        public Root createRoot() {
            return new Root();
        }
    
        @XmlElementDecl(namespace = "http://www.example.org/schema", name = "foo", scope = Root.class)
        public JAXBElement<String> createRootFoo(String value) {
            return new JAXBElement<String>(_RootFoo_QNAME, String.class, Root.class, value);
        }
    
        @XmlElementDecl(namespace = "http://www.example.org/schema", name = "bar", scope = Root.class)
        public JAXBElement<String> createRootBar(String value) {
            return new JAXBElement<String>(_RootBar_QNAME, String.class, Root.class, value);
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题