JAXB,我自己的领域模型和建议
自2005年以来,我有一个相当大的POJO域模型以增量方式构建。我们还在同一时间段内逐步开发XSD。目前,我以以下方式使用xmlbeans生成要通过HTTP发送的xml,并将其作为WebService响应的一部分JAXB,我自己的领域模型和建议,jaxb,jax-ws,cxf,Jaxb,Jax Ws,Cxf,自2005年以来,我有一个相当大的POJO域模型以增量方式构建。我们还在同一时间段内逐步开发XSD。目前,我以以下方式使用xmlbeans生成要通过HTTP发送的xml,并将其作为WebService响应的一部分 使用xmlbeans从XSD生成绑定代码 编写了许多映射程序,从我的域POJO填充绑定代码(也是相反的) 将其转换为XML 对于Web服务,我们使用。这使我们能够跨两个端点重用相同的代码:XML over HTTP和SOAP/HTTP 现在,我们希望开始使用JAXB,因为它是成熟的、标
注意:我是专家组的负责人和成员 1-如何在不生成绑定代码的情况下使用JAXB。i、 我不知道 想要继续编写或维护映射代码(步骤2)。我是 想知道我是否可以使用JAXB来解组我的域POJO 直接的 使用自己的域对象的关键是基于路径的映射。如果没有这一点,绑定框架使用的模型必须与XML文档非常相似。下面是我想给出的一个示例,其中一个简单的address对象映射到的结果 下面是一个示例链接,其中相同的对象模型映射到Google和Yahoo气象服务:
2-如何将其与我的Web服务集成?我的Web服务使用相同的模式,不想复制映射 如果Axis支持多个JAXB提供程序,那么您应该能够在不进行太多配置的情况下利用MOXy。可能只需在与域模型相同的包中添加一个
jaxb.properties
文件
3-有其他最佳实践建议吗
如果您希望避免将任何编译时依赖项添加到域模型中,那么您可能需要考虑将元数据表示为XML.<
更新 以下是您通过评论提出的问题的答案: 我知道webservice API的一个限制是它们可以工作 反对“xjc产生的工厂”。在这种情况下,我相信 我不能再使用XPath映射了。如果我是,请纠正我 错。另外,如果我使用注释,我还需要使用xjc吗 我不确定CXF,但标准JAX-WS实现允许您从自己的域模型开始,或者通过XJC生成一个域模型。下面是在JAX-WS环境中从Java对象开始使用MOXy的两个示例:
我假设这是使用XPath之外的另一个选项,也是 如果我需要支持多租户,则为唯一选项 外部映射文档不是XPath的替代品,它只是指定元数据的另一种方式。有些人喜欢这种方法,如果他们不想在类上引入任何MOXy依赖项,这些依赖项将用于对象到XML或对象到JSON的转换。对于多租户,我经常注释所有共享属性,然后为每个租户创建一个映射文档来映射扩展
另外,如果我选择XPath路径,是否会影响性能 或者如果我选择XML中的元数据
使用基于路径的映射不会对性能产生任何影响。当初始化
JAXBContext
时,这一切都会得到优化。当为外部绑定文档进行引导时,JAXBContext
的创建会稍微慢一些,因为需要做更多的工作,但是由于JAXB/MOXy是例外配置,这些文档往往很小。使用外部映射文档对封送器
/解封器
没有影响。2。我知道webservice API的一个限制是它们与“由xjc生成的工厂”对抗。在这种情况下,我相信我不能再使用XPath映射了。如果我错了,请纠正我。另外,如果我使用注释,我还需要使用xjc?3吗。我假设这是使用XPath之外的另一个选项,并且也是需要支持多租户的唯一选项。另外,如果我选择XPath路径或选择XML元数据,是否会对性能产生影响?@Pangea-我已经根据您的评论更新了我的答案。请让我知道我是否能提供进一步的帮助。你能给我Moxy的mvn回购和maven group id/artifactId吗。我从来没有想到找到这个会很难:-(.我的错。我打算添加jax wsCool,我看到你编辑了标记。希望你能找到解决方案。
package blog.geocode;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement(name="kml")
@XmlType(propOrder={"country", "state", "city", "street", "postalCode"})
public class Address {
@XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:Thoroughfare/ns:ThoroughfareName/text()")
private String street;
@XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:LocalityName/text()")
private String city;
@XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:AdministrativeAreaName/text()")
private String state;
@XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:CountryNameCode/text()")
private String country;
@XmlPath("Response/Placemark/ns:AddressDetails/ns:Country/ns:AdministrativeArea/ns:SubAdministrativeArea/ns:Locality/ns:PostalCode/ns:PostalCodeNumber/text()")
private String postalCode;
}