7

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

4

3 回答 3

11

更新

这个问题可能是指ObjectFactory在创建JAXBContext. 如果您JAXBContext在上下文路径上引导 a ,那么它将检查该位置中的 ObjectFactory 以确定该包中的类:

如果您没有ObjectFactory但仍希望JAXBContext在上下文路径上创建您,您可以包含一个jaxb.index在该包中调用的文件,列出要包含在的文件JAXBContext(引用的类将自动拉入):

或者,您可以JAXBContext在类数组而不是上下文路径上引导您:


是否需要 ObjectFactory

AnObjectFactory不是必需的,尽管即使从 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 {
   ...
}
于 2011-06-22T16:00:01.467 回答
2

我认为您不需要 ObjectFactory。

它只是 XJC 生成的一个实用程序类,在某些情况下让生活更轻松。

编辑:阅读您的问题,我猜您手动创建了带有 JAXB 注释的 POJO。

考虑在“根”类上添加 XmlRootElement:http: //download.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlRootElement.html

这里有更多信息: 没有由 JAXB 生成的 @XmlRootElement

于 2011-06-22T15:23:41.380 回答
1

您不需要为 JaxB 编组器工作的工厂。如果你将一个带有列表或映射变量的对象传递给它,它实际上会正确地编组它。这当然只有在您正确初始化 JaxB 编组器到您想要编组的对象类时才是正确的。

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

于 2011-06-22T15:24:29.063 回答