分享一个 Javabean 拷贝工具

2020-12-06 16:29:13 +08:00
 KeroZhai

由于项目中需要根据条件返回 PO 中不同的字段,但又不想定义多个 VO 类,于是我就从自身需求出发,完成了下面这个 Javabean 拷贝工具。

仓库地址在这里,希望能给大家带来一点点微小的帮助,也希望大家可以提提建议,甚至帮助改进,大佬们请轻喷。

3008 次点击
所在节点    程序员
14 条回复
TheCure
2020-12-06 16:53:28 +08:00
KeroZhai
2020-12-06 17:05:04 +08:00
@callofmx 感谢回复,大概看了下,它要解决的问题应该和我是一致的,不过个人觉得可能我的用法会更简单灵活一点,特别是对字段的条件拷贝这方面,不需要定义额外的 Mapper 。
tcfenix
2020-12-06 17:16:01 +08:00
@KeroZhai 记得之前使用最广的是 cglib 的 bean copier, 有很多使用了的项目,时间跨度都很广, 是经得住考验工具

扫了一下,你的大致逻辑跟他比较接近,都是反射实现加上缓存 converter, 不知道具体的实现上有没有啥区别?
KeroZhai
2020-12-06 17:27:45 +08:00
@tcfenix 谢谢您的回复,Beancopier 我了解的不是很多,只知道它的性能可媲美直接使用 getters/setters,另外好像是浅拷贝?因为我的实现中基本类型、Date 以及 Collection 都是直接支持的,并且是递归深拷贝,一般情况下是不需要 Converter 的,只有想实现一些特殊需求的时候可以配置,例如 README 中举例的时间戳转 Date 对象。
beitayongguo
2020-12-06 17:43:22 +08:00
orika 用着还挺好的,也是字节码框架实现的
KeroZhai
2020-12-06 17:58:04 +08:00
@beitayongguo 谢谢推荐,不过感觉需要额外配置 Mapper 的话稍微有点繁琐,当然如果要是比性能我这个就完败了…不管怎样,希望能点个 Star 支持下哈哈。
xuanbg
2020-12-06 18:57:48 +08:00
序列化+反序列化就完了,要什么自行车
KeroZhai
2020-12-06 19:13:08 +08:00
@xuanbg 是,主要是有条件拷贝不同字段的需求,而且两边字段类型名称都可能不同,比如 UserPo -> UserDTO,UserPO 内又有 List<RolePO>,而 UserDTO 内对应的是 List<RoleDTO> 这样。
paragon
2020-12-06 22:30:57 +08:00
其实 spring beanutils 足够应付大多数这种场景了
xuanbg
2020-12-07 08:27:16 +08:00
@KeroZhai 那么字段怎么对应呢?搞个 map 传进去么?有写这个 map 的美国功夫,我 new 一个目标对象出来手动 set 一下就完了。
KeroZhai
2020-12-07 08:57:27 +08:00
@xuanbg 默认根据字段名来对应的,一般使用上不需要配置啥,只是需要声明一些条件,并在拷贝时指定这些条件,来决定这次拷贝要忽略哪些字段或是采取哪种策略来忽略它们。如果你使用的是 JPA 的话,应该知道关联关系可能嵌套好几层,特别是关联集合,如果全部手动 set 可能不太现实。当然如果没有这个需要的话,确实价值意义不大…
KeroZhai
2020-12-07 09:05:09 +08:00
@paragon 不过它也是浅拷贝吧,像是关联查询出来“用户-角色-权限”三种实体类,再转为 VO 的时候应该就没办法了。不过其实个人觉得我这个重点不是递归深拷贝,主要是按条件拷贝以及指定如何忽略 null 和空值两个功能比较方便,对我来说很有用...
syozzz
2020-12-07 13:03:39 +08:00
dozer?
KeroZhai
2020-12-07 14:39:58 +08:00
@syozzz 感谢回复,说实话一下子知道了好多拷贝工具…了解了一下确实挺强大的,不过正如我前面提到的,我觉得使用 XML 去配置映射有点麻烦,更倾向于使用注解。还有就是希望能尽量复用一个类,根据一定的条件选择要拷贝哪些字段,这个可能是对我来说这个工具最主要想解决的问题吧。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/732666

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX