〇、问题分析
在调试中出现这个错。
org.springframework.beans.FatalBeanException: Could not copy property ‘xxx’ from source to target; nested exception is java.lang.IllegalArgumentException
发生的代码是
import org.springframework.beans.BeanUtils
/**
* 属性拷贝, 当且仅当两个对象的非静态属性名称相同且对应的属性类型也相同时才进行属性值拷贝
* @param source 源对象
* @param target 目标对象
*/
public static void copyProperties(Object source, Object target) {
try {
// 源对象进行深复制
Object src = deepClone(source);
source = null; //释放
BeanUtils.copyProperties(src, target);
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
定位出来就是两个对象进行复制的时候报错了,说字段xxx复制报错。
初略排查看不出端倪,因为连个对象都有该字段,字段的值也没有什么越界什么的。
后来仔细对比之后发现,复制源的值是null,但是按照经验主义
null在以往的复制过程中是不会报错的。
再次深入对比,这才发现问题
source的xxx是用Integer定义,而target是用int定义的!
所以现在就变成了将null复制给int类型的变量,在java中,int是基本类型,null是关键字,null既不是对象也不是一种类型,它仅是一种特殊的值,你可以将其赋予任何引用类型,但是不能赋给基本类型!
所以这就是这个错的答案
一、问题解决
两种方式:
1、将int改成Integer,或者将Integer改成int,使两个对象的变量类型统一
2、提前将Integer的空值赋予int的默认值0,再进行复制
建议方案:
将int改成Integer,在项目中,非常不建议用基本数据类型。
因为很多场景中对象有很多,类型也很复杂,经常转来转去,比如string和整型,长整型,浮点型等的互转。
因为string通常都会是null,如果数值型数据类型使用基本数据类型,每次都要考虑null的场景,而且用默认0也不合适,再结合很多判断异常的工具类都只对null检验,就更不合适了
另外,延伸一下,在java中,万物皆对象,基本类型一方面是历史原因(新版本需要向下兼容);
另一方面是基本数据类型性能更高,使用在对性能要求极高的场景,如底层对接,通讯对接等等。
但是我们平常的业务开发根本不需要考虑这些,更多的是提高编码效率,项目结构健壮性上。
–
–
–
完毕