JAXB,我自己的领域模型和建议

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,因为它是成熟的、标

自2005年以来,我有一个相当大的POJO域模型以增量方式构建。我们还在同一时间段内逐步开发XSD。目前,我以以下方式使用xmlbeans生成要通过HTTP发送的xml,并将其作为WebService响应的一部分

  • 使用xmlbeans从XSD生成绑定代码
  • 编写了许多映射程序,从我的域POJO填充绑定代码(也是相反的)
  • 将其转换为XML
  • 对于Web服务,我们使用。这使我们能够跨两个端点重用相同的代码:XML over HTTP和SOAP/HTTP
  • 现在,我们希望开始使用JAXB,因为它是成熟的、标准的、支持多租户(至少是Moxy实现),而且作为xmlbeans的一部分也没有做多少工作。所以我的问题是

  • 如何在不生成绑定代码的情况下使用JAXB。i、 e.我不想再编写或维护映射代码(步骤2)。我想知道我是否可以使用JAXB直接解组到我的域POJO
  • 如何将其与我的Web服务集成?我的Web服务使用相同的模式,不想复制映射
  • 还有其他最佳实践建议吗
  • 我应该知道的任何陷阱/经验教训

  • 注意:我是专家组的负责人和成员

    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;
    
    }