【问题标题】:How to map different Java-Bean structures onto one another如何将不同的 Java-Bean 结构相互映射
【发布时间】:2010-09-27 07:42:28
【问题描述】:

在我们的项目中,我们必须将一个嵌套的 bean 结构映射到另一个。 (这些实际上是 JAXB 映射的 XML 文档的 Java 表示,例如,表示传入的订单文档。)这必须映射到另一个系统的完全不同的订单文档结构。

有哪些选项可以做到这一点?我更喜欢满足以下要求的东西:

  1. 当一个字段的映射未定义时,映射应该提醒我
  2. 映射应该有一些默认值,例如将同名字段映射到另一个字段,并提供标准映射,例如 int 到 String,反之亦然。
  3. 映射应该是双向的。
  4. 在定义映射时应该能够使用代码完成。

一个有前途的框架是Dozer,但它不满足1和4。与JBeanMapper相同。只需用 Java 编程就可以满足 4 个要求,但没有其他要求;使用 XSLT 可能满足 2,但仅此而已。你有更好的想法吗?

【问题讨论】:

    标签: java mapping javabeans


    【解决方案1】:

    当我们遇到这个问题时,我们最终在 Java 中的实用程序类中进行了字段映射。这是一个真正的麻烦,尤其是当您必须映射到几个不同的 Web 服务并且必须为每个服务编写映射时(其中一些是命名属性的简单 2D 映射而不是对象的层次结构,cries em>)。

    但是,通过这种方式,您确实可以分析映射目标的要求,以获得最佳质量的映射,在未设置数据的情况下设置默认值,等等。您可以在需要的映射器中抛出自定义“UndefinedMappingException”。而且由于它不是一个使用反射和/或复杂 XML 映射配置文件的蓬松库,所以速度更快。

    也就是说,这是主张“用 Java 编写”的帖子。

    【讨论】:

      【解决方案2】:

      我用commons-beanutils解决了一个类似的问题。

      我的最终目标是构建数据结构的大型 Java 文件,然后映射器为我创建了该文件。这样,我可以从程序运行时创建的快照创建测试数据。

      映射器允许定义用于对对象进行排序的键、用于在 Java 文件中生成对象名称的字段,并且我使用了一个以“class:field”作为键的映射。该值是一个实现简单“映射”接口的对象(一种方法:toJava(Object instance, String field, Object value))。

      我的主要问题是编译 2MB+ Java 文件 :)

      【讨论】:

        【解决方案3】:

        如果您正在映射具有许多略有不同变体的数据结构,那么有一个有趣的解决方案可能会对您有所帮助。例如,如果您正在为不同的业务案例和产品变体建模业务订单结构,并且不同的变体需要相同属性(如地址、帐户 ID、产品的配置信息等)的不同组合。

        因此,您有许多结构相似的 bean,它们包含许多属性的不同子集。如果您不想为每个单独的变体编写代码,您可以引入一个 Java 接口,该接口具有这些 bean 中出现的所有属性,并使用 java.lang.reflect.Proxy 为您要映射的 bean 构造代理实例,并返回如果在实际 bean 上调用不存在的 setter,则实际 bean 没有的 getter 为 null / 抛出异常。从某种意义上说,您将接口注入到那些方法比 bean 本身更多的 bean 中。

        【讨论】:

          【解决方案4】:

          Transmorph、EZMorph、Dozer、OTOM 是您可以在 Bean 到 Bean 映射中查看的其中一些。 我过去使用过 Dozer,感觉它多年来发展得相当稳定。

          【讨论】:

            【解决方案5】:

            ModelMapper 是一个满足您所有条件的库。它提供了一个映射 API,该 API 使用实际代码来映射属性——因此您可以完成代码。它提供验证以确保映射所有目标属性。此外,它还提供了一些您甚至不知道自己想要的东西,例如智能地图 :)

            查看 ModelMapper 主页了解更多信息:

            http://modelmapper.org

            【讨论】:

              【解决方案6】:

              另一种选择是MapStruct,它在构建时生成映射代码,从而产生在运行时不需要任何依赖项的类型安全映射(免责声明:我是 MapStruct 的作者)。

              【讨论】:

                【解决方案7】:

                看看 GeDA,它使用字节码在运行时创建映射类,这使得它非常快http://genericdtoassembler.org/。它将涵盖第 1-3 点。关于第 4 点,我想这是一个 IDE 的东西,所以我认为除非它有 IDE 插件,否则我认为你不会找到任何可以促进这一点的库。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-07-20
                  • 1970-01-01
                  • 2020-12-20
                  • 1970-01-01
                  相关资源
                  最近更新 更多