我正在使用Java 6,JaxB 2和SpringSource Tool Suite(与Eclipse相同)。我有几个我编写的Java类,我从中使用JaxB生成XML模式。但是,我注意到为了使用JaxB从Java对象生成XML文档的能力,我需要一个ObjectFactory。
final Marshaller marshaller = jaxbContext.createMarshaller();
// Here is where I don't have an ObjectFactory defined
final JAXBElement<WebLeads> webLeadsElement
= (new ObjectFactory()).createWebLeads(webLeadsJavaObj);
如何在不吹走现有类的情况下生成ObjectFactory?
答案 0 :(得分:11)
<强>更新强>
此问题可能是指ObjectFactory
在创建JAXBContext
时的角色。如果您在上下文路径上引导JAXBContext
,那么它将检查该位置中的ObjectFactory以确定该包中的类:
如果您没有ObjectFactory
但仍希望在上下文路径上创建JAXBContext
,则可以在该软件包中包含一个名为jaxb.index
的文件,列出要包含在该文件包中的文件JAXBContext
(引用的类将自动拉入):
或者,您可以在类数组上引导您JAXBContext
而不是上下文路径:
需要ObjectFactory
不需要ObjectFactory
,但即使从Java类开始,也有一些用例可以利用@XmlRegistry
注释的类似类来使用@XmlElementDecl
注释。
创建JAXBElement实例
您始终可以直接创建JAXBElement
:
final JAXBElement<WebLeads> webLeadsElement = new JAXBElement<WebLeads>(
new QName("root-element-name"),
WebLeads.class,
webLeadsJavaObj);
替代JAXBElement
或者由于JAXBElement仅用于提供根元素信息,因此您可以使用WebLeads
注释@XmlRootElement
类:
@XmlRootElement(name="root-element-name")
public class WebLeads {
...
}
答案 1 :(得分:2)
我认为你不需要ObjectFactory。
这只是XJC生成的实用程序类,可以在某些情况下使生活更轻松。
编辑: 阅读你的问题,我想你是手工创建了带有JAXB注释的POJO。
考虑在“root”类上添加XmlRootElement: http://download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlRootElement.html
这里有更多信息: No @XmlRootElement generated by JAXB
答案 2 :(得分:1)
你不需要'JaxB marshaller工厂'。如果你传递一个带有列表或地图变量的对象,它实际上会正确地编组它。这当然是正确的,只有当你正确地将JaxB编组器启动到你想要编组的对象类时。
您可以创建一个工厂,该工厂可以创建一些专门的返回(假设您不希望它返回您的公共临时变量)