Java对象到对象映射的任何工具?[关闭]


231

我试图使用Java将DO转换为DTO,并在开始编写自己的工具之前寻找自动化工具。我只是想知道是否有可用的免费工具。


1
Jackson(JSON库)有一个method new ObjectMapper().convertValue(...)。杰克逊还支持注释和注释混合,因此我发现它是一个很好的选择。
西蒙·佛斯伯格

1
这是一篇具有不同框架和性能比较的文章。baeldung.com/java-performance-mapping-frameworks
Christian

Answers:


105

您可以尝试推土机

Dozer是Java Bean到Java Bean的映射器,可将数据从一个对象递归复制到另一个对象。通常,这些Java Bean将具有不同的复杂类型。

推土机支持简单属性映射,复杂类型映射,双向映射,隐式-显式映射以及递归映射。这包括映射集合属性,这些属性也需要在元素级别进行映射。


24
很长一段时间之后,我来进行更新,希望阅读我的评论:现在推土机似乎已经死了,一个不错的选择是使用MapStruct,它很容易(支持注释),快速(无反射) ),并且目前看来很安全。尽管它已包含在@Pascal Thivent列表中,但我建议使用它(即使将其与lombok一起使用时遇到一些问题)。
亚历克斯(Alex)


394

周围有一些图书馆:

  • Commons-BeanUtils:ConvertUtils->实用程序方法,用于将String标量值转换为指定Class的对象,将String数组转换为指定Class的数组。

  • Commons-Lang:ArrayUtils->对数组,原始数组(例如int [])和原始包装器数组(例如Integer [])的操作。

  • Spring框架:Spring对PropertyEditor有很好的支持,它也可以用于将对象转换为字符串。

  • Dozer:Dozer是一个功能强大但简单的Java Bean到Java Bean映射器,可将数据从一个对象递归复制到另一个对象。通常,这些Java Bean将具有不同的复杂类型。

  • ModelMapper:ModelMapper是一个智能的对象映射框架,可以自动将对象相互映射。它使用基于约定的方法来映射对象,同时提供用于处理特定用例的简单重构安全API。

  • MapStruct:MapStruct是用于bean映射的编译时代码生成器,从而在运行时产生快速的(不使用反射或类似方法),无依赖关系和类型安全的映射代码。

  • Orika:Orika使用字节码生成以最小的开销创建快速的映射器。

  • Selma:映射的编译时代码生成器

  • JMapper:使用注释,XML或API生成Bean映射器(似乎已失效,最近更新为2年)

  • Smooks的:在Smooks的JavaBean的墨盒,您可以创建和填充从你的消息数据的Java对象(即数据绑定到)(所建议superfilin在评论)。(不再积极发展)

  • Commons-Convert:Commons-Convert旨在提供一个专用于将一种类型的对象转换为另一种类型的对象的库。第一阶段将关注对象到字符串和字符串到对象的转换。(似乎已死,最后更新2010)

  • Transmorph:Transmorph是一个免费的Java库,用于将一种类型的Java对象转换为另一种类型的对象(带有其他签名,可能已参数化)。(似乎已死,最后更新2013)

  • EZMorph:EZMorph是用于将一个对象转换为另一个对象的简单Java库。它支持原语和对象的转换,多维数组的转换以及DynaBeans的转换(似乎已死,最后更新于2008年)

  • Morph:Morph是一个Java框架,可简化应用程序的内部互操作性。随着信息流经应用程序,它经历了多种转换。Morph提供了实现这些转换的标准方法。(似乎已死,最新更新为2008年)

  • Lorentz:Lorentz是一个通用的对象到对象转换框架。它提供了一个简单的API,可以将一种类型的Java对象转换为另一种类型的对象。(似乎已死)

  • OTOM:使用OTOM,您可以将任何数据从任何对象复制到任何其他对象。可能性是无止境。欢迎来到“秋天”。(似乎已死)


列表均不支持注释:(
ravinikam

1
Commons-Convert似乎不仅处于休眠状态,而且现在已经完全消失了
Jim Ferrans

实际上,如果您要将Moo添加到列表中,那么我可以删除我的答案,因为您的答案显然要完整得多。;)
Geoffrey Wiseman

3
Java 8+的另一个选项:erchu.github.io/bean-cp(免责声明:我是该项目的作者)
Rafal

1
@TmTron:完成并编辑了答案,删除了警告并引用了回购URL(因为主页仍引用0.7.5)
patric.schenke

31

另一个是Orika- https://github.com/orika-mapper/orika

Orika是Java Bean映射框架,它(除其他功能外)将数据从一个对象递归复制到另一个对象。在开发多层应用程序时,它非常有用。

Orika致力于尽可能地自动化,同时在需要时通过配置和扩展提供自定义。

Orika使开发人员能够:

  • 映射复杂且结构化的对象
  • 通过将嵌套属性映射到顶级属性来“平展”或“扩展”对象,反之亦然
  • 动态创建映射器,并应用自定义项来控制部分或全部映射
  • 创建转换器以完全控制对象图中任意位置的一组特定对象的映射-按类型,甚至按特定属性名称
  • 处理代理或增强的对象(例如Hibernate的对象或各种模拟框架)
  • 通过一种配置应用双向映射
  • 映射到目标抽象类或接口的适当具体类的实例
  • 处理反向映射
  • 处理JavaBean规范以外的复杂约定。

Orika使用字节码生成以最小的开销创建快速的映射器。


2
您可以提供一些有关orika的信息-与众不同的地方是什么
Olimpiu POP

它可能比推土机快得多-推土机安静而缓慢。
的Ondrej Bozek

21

ModelMapper是另一个值得检查的库。ModelMapper的设计与其他库的不同之处在于:

  • 通过智能匹配源属性和目标属性来自动映射对象模型
  • 提供一个重构安全映射API,该API使用实际代码映射字段和方法,而不是使用字符串
  • 利用基于约定的配置来简化自定义方案的处理

请访问ModelMapper网站以获取更多信息:

http://modelmapper.org


13

使用Apache Commons beanutils:

static void copyProperties(Object dest, Object orig) 在所有属性名称相同的情况下,将属性值从原始Bean复制到目标Bean。

http://commons.apache.org/proper/commons-beanutils/


3
是的,但是将忽略源Bean中但目标Bean中没有的属性。无论如何,谢谢Pablojim :)我想我必须和Dozer一起去,因为DO和DTO的属性名称有所不同:(
ravinikam

1
足够公平-我不知道这一点... Pascal的名单令人印象深刻!
Pablojim


3

我建议您尝试使用JMapper Framework

它是Java Bean到Java Bean的映射器,允许您使用注释和/或XML动态执行数据传递。

使用JMapper,您可以:

  • 创建并丰富目标对象
  • 将特定逻辑应用于映射
  • 自动管理XML文件
  • 实现1对N和N对1关系
  • 实施显式转换
  • 应用继承的配置

2

我很高兴将Moo添加为一个选项,尽管显然我对此有偏见:http : //geoffreywiseman.github.com/Moo/

对于简单的案例来说,它非常容易使用,对于更复杂的案例,它具有合理的能力,尽管我仍然可以想象在某些领域中进一步增强它的复杂性。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.