Jaxb:我如何生成ObjectFactory类?

时间:2011-06-22 15:19:59

标签: java jaxb jaxb2

我正在使用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?

3 个答案:

答案 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编组器启动到你想要编组的对象类时。

您可以创建一个工厂,该工厂可以创建一些专门的返回(假设您不希望它返回您的公共临时变量)