BeanUtils.copyProperties(target, o) 抛出异常org.apache.commons.beanutils.ConversionException

zyhowe 2005-06-01 08:21:13
ActionForm:
public class BbsActionForm extends ActionForm {
public String dt =null;
public void setDt(String dt) {
this.dt = dt;
}

public String getDt() {
return this.dt;
}
}

Bbs.hbm.xml:
<property column="dt" length="20" name="dt" type="java.sql.Date"/>

Bbs.java:
public class Bbs extends BaseObject {
public java.sql.Date dt = null;
public void setDt(java.sql.Date dt) {
this.dt = dt;
}
public java.sql.Date getDt() {
return this.dt;
}
}

Action:
把ActionForm转换为Bean:
Object bbsForm = (Object) form;
Bbs bbs =(Bbs)Normal.convertObjectForFormToBean(bbsForm);
bbsManager.Update(bbs);

其中Normal类:
public static Object convertObjectForFormToBean(Object o) {
Object target = null;
if (o == null) {
target = null;
} else {
try {
String name = o.getClass().getName(); int p = name.lastIndexOf("ActionForm"); name = name.substring(0, p);
Class obj = Class.forName(name);
target = obj.newInstance(); BeanUtils.copyProperties(target, o);
} catch (Exception e) {
System.out.println("Error:"+e.toString());
}
}
return target;
}

现在就是从string->java.sql.Date转换不过来,但反过来是完全可以的

...全文
520 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zyhowe 2005-06-02
  • 打赏
  • 举报
回复
怎么处理null或者""的情况呢?
zyhowe 2005-06-02
  • 打赏
  • 举报
回复
一个是Bean,一个是ActionForm
当然不一样了
sgdb 2005-06-02
  • 打赏
  • 举报
回复
public void setDt(java.sql.Date dt)

public void setDt(String dt)

这2个不一样啊,当然会出错了
zyhowe 2005-06-02
  • 打赏
  • 举报
回复
知道了,日期格式必须为
yyyy-mm-dd (斜杠/ 就会产生异常org.apache.commons.beanutils.ConversionException)

而且不能为空,继续处理中.........


humanity 2005-06-02
  • 打赏
  • 举报
回复
我记得我用 Digester 解析 XML 时 有个 注册转换器的 方法, 不知道 你这里有没有这种可能性?
myth822 2005-06-02
  • 打赏
  • 举报
回复
BeanUtils好像不支持复杂类型的
zyhowe 2005-06-02
  • 打赏
  • 举报
回复
sgdb(神天月晓) ,THX!
java.lang.IllegalArgumentException:
Cannot invoke com.test.spring.Bbs.setDt - argument type mismatch
应该跟BeanUtils无关吧


但这个异常是copyProperties抛出来的
sgdb 2005-06-02
  • 打赏
  • 举报
回复
BeanUtils对date的支持不是很好,好象只支持java.util.Date

很久 以前用过一次,虽然会报错,但是值已经都传递过去了

java.lang.IllegalArgumentException:
Cannot invoke com.test.spring.Bbs.setDt - argument type mismatch
应该跟BeanUtils无关吧
sgdb 2005-06-02
  • 打赏
  • 举报
回复
晕,越搞越麻烦,要是字段不多的话还不如不要用BeanUtils之类
zyhowe 2005-06-02
  • 打赏
  • 举报
回复
终于搞定,总结于下:
1.ActionForm:
String dt;
2.Bbs.hbm.xml:
java.sql.Date
3.Bbs.java:
java.sql.Date dt;
4.ActionForm->Bean:
放弃了原来那个BeanUtils.copyProperties(dst,src);

改用如下方法:
/**
*转换字符为java.sql.Date
*@param str 字符型日期数据
*@param format 格式化模式
*@return 返回日期
*/
public static java.sql.Date formatSqlDate(String str, String format) {
Date date =null;
try {
DateFormat df = new SimpleDateFormat(format);
date = (Date) df.parse(formatString(str).replaceAll("-", "/"));
} catch (Exception e) {
}
if(date!=null){
long t = date.getTime();
return new java.sql.Date(t);
}else
return null;
}

/**
*转换ActionForm为Bean
*@param src 源form
*@param dst 目标bean
*@param field[] 要替换的日期字段列表
*@return 返回转换后的bean
*/
public static Object convertObjectForStringToSqlDate(Object src,Object dst,String field[]){
String fieldName=",";
for(int i=0;i<field.length;i++)
fieldName+=field[i]+",";

if (src == null) {
dst = null;
} else {
PropertyDescriptor origDescriptors[] =PropertyUtils.getPropertyDescriptors(src);
for (int i = 0; i < origDescriptors.length; i++) {
String name = origDescriptors[i].getName();
if (PropertyUtils.isWriteable(dst, name))
try {
String dateValue =(String)PropertyUtils.getSimpleProperty(src, name);
if ((","+name+",").indexOf(fieldName)>=0)
BeanUtils.setProperty(dst,name,formatSqlDate(dateValue,"yyyy/MM/dd"));
else
PropertyUtils.setSimpleProperty(dst,name,dateValue);
} catch (Exception e) {
}
}
}
return dst;
}

欢迎改善意见!
zyhowe 2005-06-01
  • 打赏
  • 举报
回复
如果改Bbs.hbm.xml,Bbs.java的dt为java.util.Date则
java.lang.IllegalArgumentException:
Cannot invoke com.test.spring.Bbs.setDt - argument type mismatch

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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