一、有可能是下面三种原因:
1、getter/setter方法命名不规范,就是getUser, getuser 这样的大小写;
2、实体类方法返回值问题
new PropertyDescriptor(propertyName, clazz); 要求 setter 返回值为 void,getter 返回值为属性类型,如下的getter方法返回的类型就不对,会报Method not found错误
private Date startDate;
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
//将方法返回类型改成Date就解决了
public String getStartDate() {
return DateUtil.formatDate(startDate);
}
3、实体类使用了lombok 中的 @Accessors(chain = true) 注解
该注解使得对象的 setter 方法返回对象本身,以便链式使用
new PropertyDescriptor(propertyName, clazz); 要求 setter 返回值为 void
解决:去掉 @Accessors(chain = true) 注解即可。
二、#####使用Java反射时,还遇到了下面这个错误
java.lang.IllegalArgumentException: object is not an instance of declaring class
我是使用Java反射机制对比两个对象的属性变化的,代码如下
/**
* 获取两个对象之间的变化(仅对比当前对象写的属性,不会对比父类写的属性)
* @param oldBean
* @param newBean
* @return
*/
public String getObjectDifferent(Object oldBean, Object newBean) {
if (oldBean != null && newBean!= null) {
String modifyValue = "";
try {
Class clazz = oldBean.getClass();
List<Field> fields = new ArrayList<>();
fields.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
//如果父类属性变化也记录
fields.addAll(new ArrayList<>(Arrays.asList(clazz.getSuperclass().getDeclaredFields())));
for (Field field : fields) {
if ("serialVersionUID".equals(field.getName())) {
continue;
}
PropertyDescriptor pd = new PropertyDescriptor(field.getName(), oldBean.getClass());
Method getMethod = pd.getReadMethod();
Object o1 = getMethod.invoke(oldBean);
Object o2 = getMethod.invoke(newBean); // 这里报错了
if (o1 == null || o2 == null) {
continue;
}
if (!o1.toString().equals(o2.toString())) {
modifyValue += field.getName() + ":" + o1 + "->" + o2 + "; ";
}
}
return modifyValue;
} catch (Exception e) {
e.printStackTrace();
return e.toString();
}
} else {
log.info("传入对象为空,保存 “修改操作” 系统敏感操作记录失败");
return "保存 “修改操作” 传入对象为空";
}
}
传入的参数oldBean是从数据库查询得到的对象,newBean是前端传入的对象,两个对象是同一个类的,却报“java.lang.IllegalArgumentException: object is not an instance of declaring class”异常,查看Mapper.xml文件,发现返回类型resultType配置的是实体类的子类,将返回类型改成和oldBean的类就可以解决了,或者新建一个查询方法。
网友评论