【问题标题】:Jaxb: How do I generate ObjectFactory class?Jaxb:如何生成 ObjectFactory 类?
【发布时间】:2011-09-20 12:03:19
【问题描述】:

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

【问题讨论】:

    标签: java jaxb jaxb2


    【解决方案1】:

    更新

    这个问题可能是指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 仅用于提供根元素信息,您可以使用 @XmlRootElement 注释您的 WebLeads 类:

    @XmlRootElement(name="root-element-name")
    public class WebLeads {
       ...
    }
    

    【讨论】:

    • 关于您的“替代 JAXBElement”评论,我如何输出 XML?我根据您的指示添加了根元素,但调用“marshaller.marshal(webLeads, writer);”导致 'javax.xml.bind.JAXBException: "com.myco.systems.leadsmonitor.domain" 不包含 ObjectFactory.class 或 jaxb.in​​dex' 异常。
    • @Dave - 你是如何引导你的 JAXBContext 的?如果您在上下文路径(字符串)上引导,则需要在与域类相同的包中包含一个名为 jaxb.in​​dex 的文件,并带有类名的回车列表(例如,请参见:bdoughan.blogspot.com/2010/08/…),或者您可以在类数组上创建您的 JAXBContext(例如,请参阅:bdoughan.blogspot.com/2010/11/…)。
    • 我一直在通过使用包名称创建一个新实例来引导,但是当我更改它以创建基于类的新上下文时,一切正常。你的链接真的很有帮助。谢谢,-
    【解决方案2】:

    我认为您不需要 ObjectFactory。

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

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

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

    这里有更多信息: No @XmlRootElement generated by JAXB

    【讨论】:

    • 在 XJC 中是否可以禁止 ObjectFactory 创建?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-28
      • 2012-11-16
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 2010-10-31
      • 2011-06-27
      • 2011-02-09
      • 1970-01-01
      相关资源
      最近更新 更多