如何将不同的Java-Bean结构相互映射

时间:2008-12-17 11:43:49

标签: java mapping javabeans

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

有什么选择呢?我更喜欢满足以下要求的东西:

  1. 当未定义一个字段的映射时,映射应该提醒我
  2. 映射应该有一些默认值,例如将相同名称的字段映射到另一个上,并提供标准映射,例如int到String,反之亦然。
  3. 映射应该是双向的。
  4. 在定义映射时,应该能够使用代码完成。
  5. 一个有前途的框架是Dozer,但它不符合1和4.与JBeanMapper相同。用Java编程只需4个但不是其他要求;使用XSLT可能实现2但没有别的。你有更好的想法吗?

7 个答案:

答案 0 :(得分:5)

ModelMapper是符合您所有条件的库。它提供了一个映射API,它使用实际代码来映射属性 - 因此您可以获得代码完成。它提供验证以确保映射所有目标属性。此外,它提供了一些你甚至不知道自己想要的东西,比如智能映射:)

查看ModelMapper主页以获取更多信息:

http://modelmapper.org

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

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

即,这是一篇争论“用Java编写”的帖子。

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:1)

Transmorph,EZMorph,Dozer,OTOM是其中一些你可以看到的Bean to Bean映射。 我过去曾经使用过Dozer,并且觉得它已经变得相当稳定多年了。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

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