BeanUtil的正确使用方式

shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。

在实际的开发中,我们常常会用到工具类去拷贝对象的属性,将一个对象的属性转换成另外一个对象的属性值。首先:答应我不要去自己重复造轮子,写Beanutil了,为什么不去使用现成的工具类呢?现成的工具类简单又安全,自己写的万一哪天出了问题呢。

这里的beanUtil 我首推hutool,它的工具类的真的太丰富了,真的感觉它太懂中国的程序员了。

现在我们来一个案例:

typescript 复制代码
     public static void main(String[] args) {
         Result<String> successResult = new Result<>(200, "success", "data");
         Result<Object> errorResult = new Result<>(null, "error", null);
         System.out.println(successResult + " " + errorResult);
         BeanUtil.copyProperties(successResult, errorResult);
         System.out.println(errorResult);
     }

我需要将successResult的属性值复制到errorResult中,怎么做呢?我们直接调用api即可。输出的效果是这样的:

看到输出的结果是:successResult直接覆盖掉了errorResult的值。貌似文章在这里就可以结束了,因为这已经符合大多数的场景需求了。

但是,就怕会这个但是。我们有需求是这样的:

忽略空值:当源对象的值为null时,可选择忽略而不注入此值,否则注入null

目标对象有值不覆盖:原对象为null,则覆盖

是不是感觉原来的方法行不通了,是的,原来方法太单一了,但是我们调用api的时候稍微注意一下就会发现:

beanUtil中的copyProperties中有一个参数是copyOptionshutool官方的解释是这样的:

属性拷贝选项

包括: 1、限制的类或接口,必须为目标对象的实现接口或父类,用于限制拷贝的属性,例如一个类我只想复制其父类的一些属性,就可以将editable设置为父类 2、是否忽略空值,当源对象的值为null时,true: 忽略而不注入此值,false: 注入null 3、忽略的属性列表,设置一个属性列表,不拷贝这些属性值

似乎还是有些不明白对吧,现在我们来看看怎么使用:

typescript 复制代码
 public class MergeUtil {
 ​
     private static final CopyOptions OPTIONS = CopyOptions.create().setIgnoreNullValue(true).setOverride(false);
 ​
     private static final CopyOptions OVERRIDE_OPTIONS = CopyOptions.create().setIgnoreNullValue(true).setOverride(true);
 ​
     public static Object merge(Object sourceBean, Object targetBean) {
         BeanUtil.copyProperties(sourceBean, targetBean, OPTIONS);
         return targetBean;
     }
 ​
     public static Object mergeOverride(Object sourceBean, Object targetBean) {
         BeanUtil.copyProperties(sourceBean, targetBean, OVERRIDE_OPTIONS);
         return targetBean;
     }
 }  

CopyOptions支持链式的写法就很舒服。我们将它的可以set的属性全部的设置一下。并在代码中发起调用:

typescript 复制代码
 public static void main(String[] args) {
     Result<String> successResult = new Result<>(200, null, "data");
     Result<Object> errorResult = new Result<>(null, "error", "errorData");
     System.out.println(successResult + " " + errorResult);
     // BeanUtil.copyProperties(successResult, errorResult);
 ​
     // Result(status=200, msg=error, data=errorData)
     // MergeUtil.merge(successResult, errorResult);
 ​
     // Result(status=200, msg=error, data=data)
     MergeUtil.mergeOverride(successResult, errorResult);
     System.out.println(errorResult);
 }

代码中的Result数据稍微改造了一下。最后发现在调用中的不同:

  • 原对象的第二个参数null,目标对象第二个值最终为error
  • 原对象第三个参数data,目标对象但三个值最终分别为errorDatadata

这个在实际的开发中还是很实用的,具体场景具体的分析。

和之前一样,代码案例在shigen的gitee上,感兴趣的伙伴可以自行去查看。


以上就是今天分享的全部内容了,觉得不错的话,记得点赞 在看 关注支持一下哈,您的鼓励和支持将是shigen坚持日更的动力。同时,shigen在多个平台都有文章的同步,也可以同步的浏览和订阅:

平台 账号 链接
CSDN shigen01 shigen的CSDN主页
知乎 gen-2019 shigen的知乎主页
掘金 shigen01 shigen的掘金主页
腾讯云开发者社区 shigen shigen的腾讯云开发者社区主页
微信公众平台 shigen 公众号名:shigen

shigen一起,每天不一样!

相关推荐
Andya_net3 小时前
Spring | @EventListener事件机制深度解析
java·后端·spring
无限大64 小时前
《AI观,观AI》:专栏总结+答疑|吃透核心,解决你用AI的所有困惑
前端·后端
小杍随笔4 小时前
【Rust 语言编程知识与应用:基础数据类型详解】
开发语言·后端·rust
毅航4 小时前
告别 AI 名词焦虑:一文读懂从 LLM 到 Agent Skill的演进
人工智能·后端
LucianaiB5 小时前
干货 | 手把手教你用 OpenClaw + Skill 实现微信公众号全自动创作发布
后端
eggwyw5 小时前
springboot和springframework版本依赖关系
java·spring boot·后端
韩立学长5 小时前
Springboot奶茶加盟信息管理系统m307m786(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
开longlong了吗?6 小时前
Luan Takeaway——大模型驱动的智能外卖管理系统( Spring Cloud、Langchain4j )
后端·spring·spring cloud·langchain
品克缤6 小时前
Trading-Analysis:基于“规则+LLM”的行情分析终端(兼谈 Vibe Coding 实战感)
前端·后端·node.js·vue·express·ai编程·llama
开longlong了吗?7 小时前
Luan Takeaway System:基于Spring Boot + Spring Cloud的外卖业务系统
spring boot·后端·spring cloud