繁体   English   中英

如何将不同的Java-Bean结构映射到另一个上

[英]How to map different Java-Bean structures onto one another

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

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

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

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

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

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

http://modelmapper.org

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM