3

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

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

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

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

我不仅想问您在技术和建议方面的经验(这将基于意见),而且还想问这种方法是否会引入我遗漏的任何风险以及我可能遇到的有关 JAXB 的技术限制,如果我追求我的行动方针。谢谢!

4

1 回答 1

4

JAXBContext在包名称上创建

当您JAXBContext在包名称上创建一个时:

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

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

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

用途ObjectFactory_

就元数据而言,ObjectFactory有:

  1. create从签名中可以确定域模型的方法(如果您ObjectFactory单独引导。
  2. @XmlElementDecl注释。@XmlElementDecl注释类似于注释,但用于具有命名类型的@XmlRootElement顶级元素的 cased(参见: http ://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html )。

ObjectFactory不用于什么

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

JAXBContext在 JAX-RS 环境中创建

你提到你正在做 REST。如果您为此使用 JAX-RS 实现(例如 Jersey),那么我建议您使用 aContextResolver创建您的JAXBContext. 下面是我博客中的一个例子。在该示例中,MOXy JAXB impl 中的扩展用于提供元数据,但您可以根据需要创建它JAXBContext

于 2014-11-13T10:15:43.223 回答