八进制

少年壮志无烟抽

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  240 随笔 :: 0 文章 :: 3330 评论 :: 14 引用

在示范中心项目中,我们把ActionForm中日期类型的字段指定为String类型,而在对应的JavaBean中指定为java.sql.Date类型。当用户提交表单的时候,在Action里使用BeanUtils.copyProperties()方法从ActionForm构造JavaBean对象(详见利用BeanUtils在对象间复制属性)。这个方法在大部分时候都很好,但有一个问题,就是当用户没有填写日期类型字段时(而该字段并非必填),validator不会提出警告,而在copyProperties()时会报类型转换异常,原因是这时ActionForm中的该字段的值是空字符串(""),负责字符串向Date转换的SqlDateConverter类调用Date.valueOf("")方法,显然""是无法转换为日期的,所以会抛出异常。

通过查看代码和资料,我发现这个问题的解决方法其实非常简单。只要把带缺省值参数的SqlDateConverter重新注册一下,覆盖原有的注册信息就可以了,这个注册语句一般是写在系统初试化的地方,对于Struts应用程序,当然做在PlugIn里最方便。代码如下:

package etc;

import javax.servlet.ServletException;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.SqlDateConverter;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.PlugIn;
import org.apache.struts.config.ModuleConfig;

public class ConverterPlugIn implements PlugIn{

    public 
void init(ActionServlet servlet, ModuleConfig config) throws ServletException {
        ConvertUtils.register(
new SqlDateConverter(null),java.sql.Date.class);
    }

    public 
void destroy() {
        ConvertUtils.deregister();
    }
}

注意SqlDateConverter的构造方法是带有参数null的,这表示遇到不能解析的字符串就返回空值。而deregister()方法的作用是恢复ConvertUtils的缺省注册表。为了使这个PlugIn起作用,要在struts-config.xml里增加一句话:

<plug-in className="etc.ConverterPlugIn" />

日期字段往往会给我们的开发带来麻烦,其实在Struts应用程序里,只要把这些转换类搞熟了,总可以找到很方便的办法。常见的问题还有如何指定日期输入格式,怎样处理java.util.Date的转换,等等,在这个链接里有解决这些问题的方法,道理都是一样的。

posted on 2004-08-17 13:40 八进制 阅读(3655) 评论(7) 编辑 收藏

评论

#1楼 2005-03-08 15:25 Franck
当fromBean中的属性和持久层中的数据不一样多的情况下还能调用copyProperties()方法吗?
 回复 引用   

#2楼[楼主] 2005-03-08 18:07 八进制      
可以,不匹配的属性会被忽略。
 回复 引用 查看   

#3楼 2005-03-24 14:42 goldrain
不错不错,正是我想要的,谢谢
 回复 引用   

#4楼 2005-07-04 14:08 dyjun
我在用BeanUtils.copyProperties方法从PO向VO中复制数据时,如果数据库字段为空,则PO中的property为null,导致产生java.lang.reflect.InvocationTargetException异常,请问这个问题怎么解决?谢谢
 回复 引用   

#5楼[楼主] 2005-07-05 12:05 八进制      
最简单的方法,让PO的每个成员变量都有一个缺省值,这样数据库里也不会有空值了。
 回复 引用 查看   

我在看到BeanUtils之前就自己用“反射机制”写了一个copyBean(),
没有用上人家的好东西,自己花脑筋,有点笨。
不过也带来了额外的好处,我在form里面用了String类型,
然后自己在copyBean()就可以处理空值或其他异常了。

另外,建议大家给所有form和所有action都定义一个自己的基类,
这样有不少问题可以集中处理。
 回复 引用   

回复 八进制 2005-07-05 12:05

日期型设置缺省值有困难,无论缺省哪一天都不好的,
请问有没有什么好办法,如果能解决这个,所有东西
都有缺省值,问题会简单得多。

 回复 引用