I'm using Java 6, JaxB 2 and SpringSource Tool Suite (same as Eclipse). I had a couple of Java classes I wrote, from which I used JaxB to generate an XML schema. However, I'm noticing in order to use JaxB's ability to generate an XML document from Java objects, I need an ObjectFactory.
final Marshaller marshaller = jaxbContext.createMarshaller();
// Here is where I don't have an ObjectFactory defined
final JAXBElement<WebLeads> webLeadsElement
= (new ObjectFactory()).createWebLeads(webLeadsJavaObj);
How can I generate an ObjectFactory without blowing away the classes I already have now?
An ObjectFactory is not required, although even when starting from Java classes there are use cases where you can leverage a similar class annotated with @XmlRegistry in order to use the @XmlElementDecl annotation. You can always create the JAXBElement directly:
JAXB: Generate Classes from XSD 1 Requirements 2 XJC command. The JAXB XJC schema binding compiler transforms/binds, a source XML schema (XSD) to a set of JAXB content classes in the Java programming language. 3 XJC in Action: Generating classes form XSD. To see the command XJC in action, we will need an XSD file. ... 4 Conclusion. ...
the issue isn't your code, the issue is exactly what the exception says. jaxb classes should have a factory class named ObjectFactory in the same package as the classes. if you are generating the classes using xjc, this class will be generated for you. In fact, I am familiar with JAXB and used it in several projects.
Alternatively you can bootstrap you JAXBContext on an array of classes instead of a context path: An ObjectFactory is not required, although even when starting from Java classes there are use cases where you can leverage a similar class annotated with @XmlRegistry in order to use the @XmlElementDecl annotation.
UPDATE
This question may be referring to the role of ObjectFactory
in creating a JAXBContext
. If you bootstrap a JAXBContext
on a context path then it will check for an ObjectFactory in that location in order to determine the classes in that package:
If you do not have an ObjectFactory
but still wish to create you JAXBContext
on a context path you can include a file called jaxb.index
in that package listing files to be included in the JAXBContext
(referenced classes will automatically pulled in):
Alternatively you can bootstrap you JAXBContext
on an array of classes instead of a context path:
Is ObjectFactory Required
An ObjectFactory
is not required, although even when starting from Java classes there are use cases where you can leverage a similar class annotated with @XmlRegistry
in order to use the @XmlElementDecl
annotation.
Creating an Instance of JAXBElement
You can always create the JAXBElement
directly:
final JAXBElement<WebLeads> webLeadsElement = new JAXBElement<WebLeads>(
new QName("root-element-name"),
WebLeads.class,
webLeadsJavaObj);
Alternative to JAXBElement
Or since JAXBElement is simply used to provide root element information, you can annotate your WebLeads
class with @XmlRootElement
:
@XmlRootElement(name="root-element-name")
public class WebLeads {
...
}
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