一烟央、有可能是下面三種原因:
1洼滚、getter/setter方法命名不規(guī)范察藐,就是getUser, getuser 這樣的大小寫皮璧;
2、實(shí)體類方法返回值問(wèn)題
new PropertyDescriptor(propertyName, clazz); 要求 setter 返回值為 void分飞,getter 返回值為屬性類型悴务,如下的getter方法返回的類型就不對(duì),會(huì)報(bào)Method not found錯(cuò)誤
private Date startDate;
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
//將方法返回類型改成Date就解決了
public String getStartDate() {
return DateUtil.formatDate(startDate);
}
3譬猫、實(shí)體類使用了lombok 中的 @Accessors(chain = true) 注解
該注解使得對(duì)象的 setter 方法返回對(duì)象本身讯檐,以便鏈?zhǔn)绞褂?br>
new PropertyDescriptor(propertyName, clazz); 要求 setter 返回值為 void
解決:去掉 @Accessors(chain = true) 注解即可。
二染服、#####使用Java反射時(shí)别洪,還遇到了下面這個(gè)錯(cuò)誤
java.lang.IllegalArgumentException: object is not an instance of declaring class
我是使用Java反射機(jī)制對(duì)比兩個(gè)對(duì)象的屬性變化的,代碼如下
/**
* 獲取兩個(gè)對(duì)象之間的變化(僅對(duì)比當(dāng)前對(duì)象寫的屬性柳刮,不會(huì)對(duì)比父類寫的屬性)
* @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); // 這里報(bào)錯(cuò)了
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("傳入對(duì)象為空,保存 “修改操作” 系統(tǒng)敏感操作記錄失敗");
return "保存 “修改操作” 傳入對(duì)象為空";
}
}
傳入的參數(shù)oldBean是從數(shù)據(jù)庫(kù)查詢得到的對(duì)象诚亚,newBean是前端傳入的對(duì)象晕换,兩個(gè)對(duì)象是同一個(gè)類的,卻報(bào)“java.lang.IllegalArgumentException: object is not an instance of declaring class”異常站宗,查看Mapper.xml文件闸准,發(fā)現(xiàn)返回類型resultType配置的是實(shí)體類的子類,將返回類型改成和oldBean的類就可以解決了梢灭,或者新建一個(gè)查詢方法夷家。