java - 将自定义 ObjectFactory 与 JAXB 一起使用 : is there an established "go to" pattern?

标签 java jaxb objectfactory

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

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

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

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

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

最佳答案

在包名上创建一个JAXBContext

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

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

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

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

ObjectFactory 的用途

就元数据而言,ObjectFactory 具有:

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

ObjectFactory 不用于什么

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

在 JAX-RS 环境中创建 JAXBContext

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

关于java - 将自定义 ObjectFactory 与 JAXB 一起使用 : is there an established "go to" pattern?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26905995/

相关文章:

java - TomcatEmbeddedServletContainer - 需要身份验证对话框

java spring websocket发送来自其他应用程序的回复

Java 类到 XSD

xpath - EclipseLink MOXy : Logical operators in XmlPath annotation

c++ - 在堆栈上分配一个小对象比在堆上创建它(一次)更有效吗?

Java编译困惑: why does this code compile?

java - 将日期从 20160729161455 转换为 29/07/2016 16 :14:55

jaxb - jaxb 2.0版未在xmlrootelement中使用name属性

java - 解码时不使用 JAXB 自己的对象工厂

xslt - 使用 JDK 内部 Xalan 和 SecurityManager 从 XSL 样式表内部加载外部 Java 方法