I' have simple question about JAXB. Here is the sample code:
//setter that has input JAXBElement
b.setBIC(JAXBElement<String> value);
How can I initialize the input element, that uses String from other object?
Code example extracted from Stack Overflow: ObjectFactory factory = new ObjectFactory(); JAXBElement<String> createMessageDescription = factory. createMessageDescription("description"); message. setDescription(createMessageDescription);
QName represents an immutable qualified name. The value of a QName contains a Namespace URI, local part and prefix. The prefix is included in QName to retain lexical information when present in an XML input source. The prefix is NOT used in QName. equals(Object) or to compute the QName.
Java Architecture for XML Binding (JAXB) provides a fast and convenient way to bind XML schemas and Java representations, making it easy for Java developers to incorporate XML data and processing functions in Java applications.
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);
}
}
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"));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With