如何将不同的JavaBean结构相互映射

如何将不同的JavaBean结构相互映射,java,mapping,javabeans,Java,Mapping,Javabeans,在我们的项目中,我们必须将一个嵌套的bean结构映射到另一个。(这些实际上是JAXB映射的XML文档的Java表示,比如说,表示传入的订单文档。)这必须映射到另一个系统的完全不同的订单文档结构上 有什么办法可以做到这一点?我更喜欢满足以下要求的产品: 当一个字段的映射未定义时,映射应提醒我 映射应该有一些默认值,比如将名称相同的字段映射到另一个字段,并为int到String提供标准映射,反之亦然 映射应该是双向的 在定义映射时,应该能够使用代码完成 这是一个很有希望的框架,但它没有实现1和4。我

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

有什么办法可以做到这一点?我更喜欢满足以下要求的产品:

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

  • 这是一个很有希望的框架,但它没有实现1和4。我也是。仅用Java编程就可以满足4项要求,但不能满足其他要求;使用XSLT可能实现了2个功能,但除此之外没有其他功能。你有更好的想法吗?

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

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


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

    我解决了一个类似的问题

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

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


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

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


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

    Transmorph、Ezmorp、Dozer、OTOM是可以查看bean到bean映射的其中一些方法。 我在过去使用过推土机,并且觉得它在过去的几年中变得相当稳定。

    是一个符合您所有标准的库。它提供了一个映射API,该API使用实际代码映射属性,因此您可以完成代码。它还提供验证,以确保映射所有目标属性。此外,它还提供了一些您甚至不知道需要的功能,例如智能映射:)

    有关更多信息,请查看ModelMapper主页:


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

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