Java 在JAXB中使用自定义ObjectFactory:是否有一个;请转到";图案

Java 在JAXB中使用自定义ObjectFactory:是否有一个;请转到";图案,java,jaxb,objectfactory,Java,Jaxb,Objectfactory,我知道在使用JAXB时,ObjectFactory通常是自动生成的,因为人们可能会首先定义模式和XML。然而,这不是我处理这个项目的方式 我已经有了需要注释和扩展的现有代码,以使用JAXB,然后将其与REST服务结合使用。我只有少数几个类,并且已经对它们进行了注释。就我对文档的理解而言(我是JAXB新手),我需要通过包实现ObjectFactory,以便在包级别上自动调用,或者在直接引用而不是通过包上下文引用时需要大量实现 我有点不确定最好的方法是什么。如果每个包使用一个实现,那么管理器将相当抽

我知道在使用JAXB时,
ObjectFactory
通常是自动生成的,因为人们可能会首先定义模式和XML。然而,这不是我处理这个项目的方式

我已经有了需要注释和扩展的现有代码,以使用JAXB,然后将其与REST服务结合使用。我只有少数几个类,并且已经对它们进行了注释。就我对文档的理解而言(我是JAXB新手),我需要通过包实现
ObjectFactory
,以便在包级别上自动调用,或者在直接引用而不是通过包上下文引用时需要大量实现

我有点不确定最好的方法是什么。如果每个包使用一个实现,那么管理器将相当抽象,实例化许多类。然而,我不确定这是一种“正确”的方式。我个人会选择将实例化关注点分离到
ObjectFactory
的单独实例中,即每个类有一个工厂。因此,我将实现类似于该模式的东西

我的工程背景告诉我,分离关注点和选择扩展而不是修改将是一个更好的选择。因此,我的直觉告诉我,单片
ObjectFactory
仅在从XML而不是代码开始的方法产生时使用。但我没有足够的经验做出明智的选择

我想问你们的不仅是你们在技术和建议方面的经验(这将是基于意见的),而且这种方法是否会带来我所遗漏的任何风险,以及如果我继续我的行动方针,我可能会遇到的有关JAXB的技术限制。谢谢大家!

在包名上创建
JAXBContext
在包名称上创建
JAXBContext
时:

JAXBContext jc = JAXBContext.newInstance("com.example.foo");
JAXB实现不进行包扫描,因此它需要在包中找到可以派生模型其余部分的内容。这可以是:

  • 带有引用域模型的
    create
    方法的
    ObjectFactory
    类。当您的模型是从XML模式生成的时,这种引导是最好的
  • 一个
    jaxb.index
    文件,它只是要引导
    JAXBContext
    的类的短类名(非包限定)的回车分隔列表。这不需要是整个列表,因为JAXB将引入引用的类。当您从Java类开始时,最好使用这种方法
  • ObjectFactory
    用于什么 就元数据而言,
    ObjectFactory
    具有:

  • create
    方法,从其签名可以确定域模型(如果仅在
    ObjectFactory
    上引导)
  • @xmlementdecl
    注释。
    @xmlementdecl
    注释类似于
    @XmlRootElement
    注释,但用于具有命名类型的顶级元素(请参见:)
  • ObjectFactory
    不用于什么 在
    umarshal
    操作期间,不使用
    ObjectFactory
    创建域类的实例。有关更多信息,请参阅下面链接的问题:

    在JAX-RS环境中创建
    JAXBContext
    您提到您正在做REST,如果您正在为此使用JAX-RS实现(例如Jersey)然后我建议使用
    ContextResolver
    来创建
    JAXBContext
    。下面是我博客中的一个例子。在这个例子中,MOXy JAXB impl中的一个扩展用于提供元数据,但您可以按照自己的意愿创建
    JAXBContext


    谢谢你的回答。我似乎误解了我参考的一些教程和资源。使用JAXB 2.0,
    ObjectFactory
    只是用于声明目的,实际上没有提供任何功能?也就是说,分析了方法和注释的签名,但从未实际调用过。我假设因此,推荐的方法是使用
    jaxb.index
    文件。我将在本周晚些时候尝试它。@EricTobias我不会使用
    jaxb.index
    ,因为它在重构过程中可能会导致错误。
    ObjectFactory
    是“虚拟的”,但它是经过编译的。@lexicore-在JAX-RS中(OP-REST)尽管如此,我还是会通过
    ContextResolver
    创建
    JAXBContext
    ,然后在我的域类上创建它。这比创建
    ObjectFactory
    更直接。我已经看过了使用适配器的过程,但即使使用了成熟的适配器套件,我也会收到一个错误,即我没有提供无参数构造函数(尽管将适配器指定为访问器类型)或我没有指定XML根元素。由于我现在面临的问题不再与我的问题相关,我将在等待返回注释后将其删除。