BeanUtils.copyProperty的用法问题

xharry 2010-03-26 06:37:27
我想写一个类,把Database的ResultSet封装一下。用了BeanUtils.copyProperty方法,总是报如下错误:

USING CONVERTER org.apache.commons.beanutils.converters.IntegerConverter@1befab0
java.lang.reflect.InvocationTargetException: Cannot set id
at org.apache.commons.beanutils.BeanUtilsBean.copyProperty(BeanUtilsBean.java:449)
at org.apache.commons.beanutils.BeanUtils.copyProperty(BeanUtils.java:129)


Caused by: java.lang.NoSuchMethodException: Property 'id' has no setter method
at org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:1746)
at org.apache.commons.beanutils.BeanUtilsBean.copyProperty(BeanUtilsBean.java:447)


可是,UserInfo这个bean里面明明有set方法,而且是public,eclipse总是报错说找不到set方法。

有知道为什么的么?


下面为代码:

/**
*
* @author wcharry
*
*/
public class MyDataSet {
private static Log log = LogFactory.getLog(MyDataSet.class);
private List list = new ArrayList();

public MyDataSet(ResultSet rs) {
try {
dumpResultSet(rs);
} catch (SQLException e) {
e.printStackTrace();
}
}

public MyDataSet(ResultSet rs, Class clazz) {
try {
dumpResultSet(rs, clazz);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public int size() {
return list.size();
}

public Object get(int i) {
return list.get(i);
}

public Object get(int row, int col) {
HashMap hm = (HashMap) list.get(row);

Iterator iterator = hm.values().iterator();
int iCol = 0;
while (iterator.hasNext()) {
if (iCol == col)
return iterator.next();

iCol++;
}

return null;
}

public Object get(int row, String key) {
HashMap hm = (HashMap) list.get(row);

return hm.get(key);
}


private void dumpResultSet(ResultSet rs, Class clazz) throws Exception {
ResultSetMetaData metaData = (ResultSetMetaData) rs.getMetaData();
int colCount = metaData.getColumnCount();

Field[] fields = clazz.getDeclaredFields();

while (rs.next()) {
Object newInstance = clazz.newInstance();

for (int i = 1; i <= colCount; i++) {
try {
Object value = rs.getObject(i);
for (int j = 0; j < fields.length; j++) {
Field f = fields[j];
if (f.getName().equalsIgnoreCase(
metaData.getColumnName(i).replaceAll("_", ""))) {

log.info("f.getName:" + f.getName());

// 这里总是报错
BeanUtils.copyProperty(newInstance, f.getName(),
value);

log.info("value:" + value);
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}

}

list.add(newInstance);
}
}

/**
* @param args
*/
public static void main(String[] args) {
String sql = "SELECT * FROM users";
ResultSet rs = DatabaseFactory.getInstance("mysql").executeQuery(sql);

MyDataSet ds2 = new MyDataSet(rs, UserInfo.class);

for (int i = 0; i < ds2.size(); ++i) {
UserInfo o = (UserInfo) ds2.get(i);
System.out.println(o.getUser());
}

DatabaseFactory.getInstance("mysql").closeConnection();
}
}



class UserInfo {
private int id;
private String user;
private String password;

public UserInfo() {
}

// public String toString() {
// return "id:" + id + ", user:" + user;
// }

public String getUser() {
return user;
}

public void setUser(String user) {
this.user = user;
}

public String getPassword() {
return password;
}

public void setPassword(String password) {
this.password = password;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}
}


...全文
607 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
kokobox 2010-03-26
  • 打赏
  • 举报
回复
自问自答啊?

再问问其他问题吧,别浪费了帖子。
xharry 2010-03-26
  • 打赏
  • 举报
回复
原因找到了

class UserInfo {

改为

public class UserInfo {

就可以了,WTF!!

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧