我知道在使用JAXB时通常会自动生成ObjectFactory
,因为人们可能首先定义架构和XML。但是,这不是我接触项目的方式。
我有现有的代码需要注释和扩展才能使用JAXB然后将其与REST服务结合使用。我只有一些课程并且已经注释了它们。据我所知,文档(我是JAXB的新手),我需要一个ObjectFactory
的实现,包括在包级别上的自动调用,或者在直接引用而不是引用它们时的大量实现按包上下文。
我有点不确定最好的方法是什么。如果我每个包使用一个实现,那么管理器将是相当抽象的,实例化许多类。但是,我不确定这是“正确”的做法。我个人会选择将实例化的关注点分离到ObjectFactory
的单独实例中,即每个类别有一个工厂。因此,我会实现类似于Data Access Object模式的东西。
我的工程背景告诉我,关注点的分离和选择扩展而不是修改将是更好的选择。因此,我的直觉告诉我,单片ObjectFactory
仅在从XML而不是代码开始的方法生成时使用。然而,我没有足够的经验做出明智的选择。
我想问你不仅要了解你对技术和建议的经验(这将基于意见),还要问你这种方法是否会引入我所遗漏的任何风险,以及我对JAXB的技术限制如果我继续采取行动,就会陷入困境。谢谢!
答案 0 :(得分:3)
JAXBContext
在包名称上创建JAXBContext
时:
JAXBContext jc = JAXBContext.newInstance("com.example.foo");
JAXB实现不进行包扫描,因此需要在该包中找到可以从中导出模型其余部分的内容。这可以是:
ObjectFactory
类,其create
方法引用了域模型。当您从XML Schema生成模型时,最好先引导它。jaxb.index
文件,它只是一个回车分隔的短类名列表(不是包限定的),用于引导JAXBContext
的类。这不需要是整个列表,因为JAXB将引入引用的类。从Java classe开始,最好使用这种方法。ObjectFactory
用于什么就元数据而言,ObjectFactory
具有:
create
方法可以确定域模型(如果您仅在ObjectFactory
上进行自举。@XmlElementDecl
注释。 @XmlElementDecl
注释类似于@XmlRootElement
注释,但在套件中用于具有命名类型的顶级元素(请参阅:http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html)。ObjectFactory
未使用的内容 ObjectFactory
操作期间未使用umarshal
来创建域类的实例。有关更多信息,请参阅以下链接的问题:
JAXBContext
你提到你在做REST。如果您正在使用JAX-RS实现(例如Jersey),那么我建议您使用ContextResolver
来创建JAXBContext
。以下是我博客的示例。在该示例中,MOXy JAXB impl中的扩展用于提供元数据,但您可以随意创建JAXBContext
。