将自定义ObjectFactory与JAXB一起使用:是否已建立"转到"图案?

时间:2014-11-13 09:58:14

标签: java jaxb objectfactory

我知道在使用JAXB时通常会自动生成ObjectFactory,因为人们可能首先定义架构和XML。但是,这不是我接触项目的方式。

我有现有的代码需要注释和扩展才能使用JAXB然后将其与REST服务结合使用。我只有一些课程并且已经注释了它们。据我所知,文档(我是JAXB的新手),我需要一个ObjectFactory的实现,包括在包级别上的自动调用,或者在直接引用而不是引用它们时的大量实现按包上下文。

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

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

我想问你不仅要了解你对技术和建议的经验(这将基于意见),还要问你这种方法是否会引入我所遗漏的任何风险,以及我对JAXB的技术限制如果我继续采取行动,就会陷入困境。谢谢!

1 个答案:

答案 0 :(得分:3)

在包名称上创建JAXBContext

在包名称上创建JAXBContext时:

JAXBContext jc = JAXBContext.newInstance("com.example.foo");

JAXB实现不进行包扫描,因此需要在该包中找到可以从中导出模型其余部分的内容。这可以是:

  1. ObjectFactory类,其create方法引用了域模型。当您从XML Schema生成模型时,最好先引导它。
  2. 一个jaxb.index文件,它只是一个回车分隔的短类名列表(不是包限定的),用于引导JAXBContext的类。这不需要是整个列表,因为JAXB将引入引用的类。从Java classe开始,最好使用这种方法。
  3. ObjectFactory用于什么

    就元数据而言,ObjectFactory具有:

      来自签名的
    1. create方法可以确定域模型(如果您仅在ObjectFactory上进行自举。
    2. @XmlElementDecl注释。 @XmlElementDecl注释类似于@XmlRootElement注释,但在套件中用于具有命名类型的顶级元素(请参阅:http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html)。
    3. ObjectFactory未使用的内容

      ObjectFactory操作期间未使用umarshal来创建域类的实例。有关更多信息,请参阅以下链接的问题:

      在JAX-RS环境中创建JAXBContext

      你提到你在做REST。如果您正在使用JAX-RS实现(例如Jersey),那么我建议您使用ContextResolver来创建JAXBContext。以下是我博客的示例。在该示例中,MOXy JAXB impl中的扩展用于提供元数据,但您可以随意创建JAXBContext