• 前置知识: SpringBean ORM Java企业级开发基础

背景

在使用ORM框架读取数据库表记录时,为了把PO(Persist Object)转换成BO(Business Object),由于PO和BO中的字段绝大多数情况下高度重合,因此copyProperties()也是经常使用的函数,但是如果使用不当就会抛出Exception

举个例子,有这么一个系统:

  1. Database的Table中有data字段(tinyint)
  2. PO中有data字段(Boolean)
  3. BO中有data字段(boolean)

在数据库的data字段为null时,调用copyProperties(PO,BO)时就会抛出异常:Caused by java.lang.IllegalArgumentException

代码分析

Example of copyProperties()

private static void copyProperties(Object source, Object target, Class<?> editable, String[] ignoreProperties)throws BeansException {
/** 略 **/if (sourcePd != null && sourcePd.getReadMethod() != null) {try {Method readMethod = sourcePd.getReadMethod();if (!Modifier.isPublic(readMethod.getDeclaringClass().getModifiers())) {readMethod.setAccessible(true);}Object value = readMethod.invoke(source);Method writeMethod = targetPd.getWriteMethod();if (!Modifier.isPublic(writeMethod.getDeclaringClass().getModifiers())) {writeMethod.setAccessible(true);}writeMethod.invoke(target, value); /**异常抛出点**/}catch (Throwable ex) {throw new FatalBeanException("Could not copy properties from source to target", ex);}}/** 略 **/
}

总结一下: 该方法复制字段(可以不同Class,但是目标字段的类型必须和源字段类型兼容)原理是获得源对象字段的getter方法和目标对象字段的setter方法

Example of PO and its ReadMethod

private Boolean data;
public Boolean getData(Boolean data){return this.data;
}

Example of BO and its WriteMethod

private boolean data;
public setData(boolean data){this.data = data;
}

具体就是挂在调用BO.setData(null)时, 对一个基本类型boolean赋值为null

措施分析

  1. 新增数据库字段时指定默认值,并设置为Not Null
  2. 为PO的字段指定默认值,如private Boolean data = true;

    • _推荐这种方式_,因为BO中字段为基本类型,上面的业务层就不需要额外判断是否是null
    • 如果表中数据为null,则ORM(iBatis/MyBatis)不会调用PO相应字段的setter方法,所以为PO的字段指定默认值是可行的

【Spring】BeanUtils.copyPorperties()的IllegalArgumentException原因分析相关推荐

  1. Hasor【付诸实践 01】低代码框架 DataQL 聚合查询引擎 SQL执行器报错 Query dialect missing 原因分析及解决(针对GreenPlum数据库)

    1.报错说明 在本地搭建了两个平台,hasor核心依赖的版本是一致的, 连接的都是GreenPlum数据库 ,且执行的是相同的DataQL语句: <!--hasor核心依赖[是老平台接入,由于兼 ...

  2. 【spring源码】源码分析

    [spring源码]源码分析 (一)mac版idea引入spring源码 (二)spring的学习流程 (三)spring源码分析 [1]refresh()方法概览(AbstractApplicati ...

  3. 接口方法上的注解无法被@Aspect声明的切面拦截的原因分析

    转载自  接口方法上的注解无法被@Aspect声明的切面拦截的原因分析 前言 在Spring中使用MyBatis的Mapper接口自动生成时,用一个自定义的注解标记在Mapper接口的方法中,再利用@ ...

  4. @Autowired报错的4种解决方案和原因分析!

    作者 | 王磊 来源 | Java中文社群(ID:javacn666) 转载请联系授权(微信ID:GG_Stone) 上图的报错信息相信大部分程序员都遇到过,奇怪的是虽然代码报错,但丝毫不影响程序的正 ...

  5. 空指针异常的原因分析

    空指针异常的原因分析: 1.当一个对象不存在时又调用其方法会产生异常obj.method() // obj对象不存在 2. 调用空对象的方法时就会抛出 NullPointerException 空指针 ...

  6. Tomcat内存溢出原因分析

    Tomcat内存溢出的原因  在生产环境中tomcat内存设置不好很容易出现内存溢出.造成内存溢出是不一样的,当然处理方式也不一样. 这里根据平时遇到的情况和相关资料进行一个总结.常见的一般会有下面三 ...

  7. Java常见异常类型及原因分析

    Java常见异常类型及原因分析 0x1 NullPointerException异常 顾名思义,NullPointerException 是空指针异常.但是在 Java 中没有指针,怎么会有 空指针异 ...

  8. spring+dbcp连接池源码分析

    Spring对数据库连接池的支持 常见的数据库连接池有c3p0,dbcp以及druid,这里使用的是dbcp. 前文中使用DataSourceUtils获取和释放connection,代码如下: // ...

  9. 【linux】ARM开发板上设置RTC时间,断电重启后,设置失效的原因分析

    问题描述 linux中使用date设置时间后用hwclock -w同步到RTC,断电重启后,有时会失效 原因分析 保存时间戳 1.使用命令关机(halt)会调用rc0.d中的脚本: 2.使用命令重启( ...

最新文章

  1. 自己服务器上部署APP应用(安卓和IOS版),下载页面的代码,以及IOS的xxx.plist文件的建立
  2. Hadoop学习之以全分布模式部署及问题
  3. 第二章 搜索 【未完结】
  4. #1182 : 欧拉路·三(有向图的欧拉路)
  5. python实现异步的几种方式_终于搞明白了,异步Python比同步Python究竟快在哪里?...
  6. Spring Boot中的高级配置文件管理
  7. 构建Spring微服务并对其进行Dockerize生产
  8. 图解 IDEA 中 springboot 项目 MyBatis Generator 逆向生成实体类及 mapper 配置文件
  9. REDHAT5.6dhcp服务器及dhcp中继代理配置
  10. 从0开始搭建产品经理AI知识框架:语音识别与合成
  11. ARM平台AMBA总线uart驱动和console初始化
  12. Unity调用打印机打印图片
  13. 聊一聊关于“元宇宙”涉及的前端技术
  14. Transformer论文阅读(一):CoTr: Efficiently Bridging CNN and Transformer for 3D Medical Image Segmentation
  15. JAVA 写入数据不覆盖_Java不覆盖原文件写入
  16. c语言sql数据库大作业,c语言连接sql数据库.docx
  17. 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径, 使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。
  18. Linux 管理联网 nmcli常用命令
  19. Xcode 的各种版本的下载地址
  20. PC客户端软件的安装和卸载测试知识点

热门文章

  1. 转帖:关于MongoDB你需要知道的几件事
  2. 数据库——startup,startup mount,startup nomount有什么区别
  3. Redhate5.4下Oracle 11g安装
  4. NHibernateLinq简单的CRUD操作
  5. Asp.net based Web Application部署后的问题
  6. 编写多线程Java应用程序常见问题
  7. 计算机基础课程教学创新,计算机基础课程教学学生创新能力的培养-计算机基础论文-计算机论文(12页)-原创力文档...
  8. Linux-鸟菜-7-Linux文件系统-EXT
  9. hdu4930 模拟斗地主
  10. hdu4908 中位数子串