由于项目中需要根据条件返回 PO 中不同的字段,但又不想定义多个 VO 类,于是我就从自身需求出发,完成了下面这个 Javabean 拷贝工具。
仓库地址在这里,希望能给大家带来一点点微小的帮助,也希望大家可以提提建议,甚至帮助改进,大佬们请轻喷。
大家评论里提到的其他优秀的拷贝工具我大概都了解了下,感觉自己确实孤陋寡闻了...不过如果只考虑功能而不考虑具体实现、性能等,我觉得我这个工具还是有它的可取之处和用武之地的,并且相对来说应该是简单易用的,后续的目标也是保持简单的上层 API 不变,持续优化底层实现,提高性能。
突然想起来项目里写的几个粗略的单元测试刚好可以作为简单的示例,从而直观地展示下几个功能和用法,有兴趣的小伙伴可以抽空瞄两眼:
1
TheCure 2020-12-06 16:53:28 +08:00 1
|
2
KeroZhai OP @callofmx 感谢回复,大概看了下,它要解决的问题应该和我是一致的,不过个人觉得可能我的用法会更简单灵活一点,特别是对字段的条件拷贝这方面,不需要定义额外的 Mapper 。
|
3
tcfenix 2020-12-06 17:16:01 +08:00
@KeroZhai 记得之前使用最广的是 cglib 的 bean copier, 有很多使用了的项目,时间跨度都很广, 是经得住考验工具
扫了一下,你的大致逻辑跟他比较接近,都是反射实现加上缓存 converter, 不知道具体的实现上有没有啥区别? |
4
KeroZhai OP @tcfenix 谢谢您的回复,Beancopier 我了解的不是很多,只知道它的性能可媲美直接使用 getters/setters,另外好像是浅拷贝?因为我的实现中基本类型、Date 以及 Collection 都是直接支持的,并且是递归深拷贝,一般情况下是不需要 Converter 的,只有想实现一些特殊需求的时候可以配置,例如 README 中举例的时间戳转 Date 对象。
|
5
beitayongguo 2020-12-06 17:43:22 +08:00
orika 用着还挺好的,也是字节码框架实现的
|
6
KeroZhai OP @beitayongguo 谢谢推荐,不过感觉需要额外配置 Mapper 的话稍微有点繁琐,当然如果要是比性能我这个就完败了…不管怎样,希望能点个 Star 支持下哈哈。
|
7
xuanbg 2020-12-06 18:57:48 +08:00
序列化+反序列化就完了,要什么自行车
|
8
KeroZhai OP @xuanbg 是,主要是有条件拷贝不同字段的需求,而且两边字段类型名称都可能不同,比如 UserPo -> UserDTO,UserPO 内又有 List<RolePO>,而 UserDTO 内对应的是 List<RoleDTO> 这样。
|
9
paragon 2020-12-06 22:30:57 +08:00
其实 spring beanutils 足够应付大多数这种场景了
|
10
xuanbg 2020-12-07 08:27:16 +08:00
@KeroZhai 那么字段怎么对应呢?搞个 map 传进去么?有写这个 map 的美国功夫,我 new 一个目标对象出来手动 set 一下就完了。
|
11
KeroZhai OP @xuanbg 默认根据字段名来对应的,一般使用上不需要配置啥,只是需要声明一些条件,并在拷贝时指定这些条件,来决定这次拷贝要忽略哪些字段或是采取哪种策略来忽略它们。如果你使用的是 JPA 的话,应该知道关联关系可能嵌套好几层,特别是关联集合,如果全部手动 set 可能不太现实。当然如果没有这个需要的话,确实价值意义不大…
|
12
KeroZhai OP @paragon 不过它也是浅拷贝吧,像是关联查询出来“用户-角色-权限”三种实体类,再转为 VO 的时候应该就没办法了。不过其实个人觉得我这个重点不是递归深拷贝,主要是按条件拷贝以及指定如何忽略 null 和空值两个功能比较方便,对我来说很有用...
|
13
syozzz 2020-12-07 13:03:39 +08:00
dozer?
|