我知道 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 实现不进行包扫描,因此它需要在该包中找到可以派生模型其余部分的内容。这可以是:
- 一个
ObjectFactory
类,带有引用域模型的create
方法。当您的模型是从 XML 模式生成时,最好引导它 - 一个
jaxb.index
文件,它只是一个回车符分隔的短类名列表(不是包限定的),这些类名是您要在其上引导JAXBContext
的类.这不需要是整个列表,因为 JAXB 将引入引用的类。当您从 Java 类开始时,最好使用这种方法。
ObjectFactory
的用途
就元数据而言,ObjectFactory
具有:
create
方法可以根据其签名确定域模型(如果您单独在ObjectFactory
上引导。@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/