最近在使用BeanUtils 时出现了一个错误
Exception in thread "main" java.lang.reflect.InvocationTargetException: Cannot set id
at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1017)
at org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:456)
at com.mizhanke.tpjob.Demo5.main(Demo5.java:68)
Caused by: java.lang.NoSuchMethodException: Property 'id' has no setter method in class 'class com.mizhanke.tpjob.Emp'
at org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:2128)
at org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1948)
at org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:2054)
at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1015)
... 2 more
Demo5.java
public class Demo5 {
public static void main(String[] args) throws Exception {
String id = "100";
String name = "rose";
String salary = "1000";
/*
* 如果不是基本数据类型(如:日期格式的字符串,Ojcect类型) , 则不能自动转换,因为日期格式的字符串是有各种各样的格式
*
*
* 解决方法:
* 1.直接 new Date(2017, 2, 20) 对象
* 2.注册一个类型转换器
*
* 一般情况都是使用 方法1
*
*/
//Date birthday = new SimpleDateFormat("yyyy-MM-dd").parse("2017-02-20");
String birthday = "2015-12-06";
ConvertUtils.register(new Converter() {
@Override
public Object convert(Class type, Object value) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date date = null;
try {
date = format.parse((String) value);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}, Date.class);
Emp emp = new Emp();
BeanUtils.setProperty(emp, "id", id);
BeanUtils.setProperty(emp, "name", name);
BeanUtils.setProperty(emp, "salary", salary);
BeanUtils.setProperty(emp, "birthday", birthday);
System.out.println(emp);
}
}
Emp.java
class Emp {
private int id;
private String name;
private double salary;
private Date birthday;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Emp() {
}
public Emp(int id, String name, double salary, Date birthday) {
this.id = id;
this.name = name;
this.salary = salary;
this.birthday = birthday;
}
@Override
public String toString() {
return String.format("{id=%d,name=%s,salary=%s,birthday=%s}", id, name,salary,birthday);
}
}
通过和以前的代码对比发现:
以前能运行的代码比 Emp.java 多了一个public 修改符,然后以Emp.java 加上了 public 修饰符就可以运行了。
原因:可能是由于 BeanUtils 和 Emp 不在同一个包下面,所以访问不到。