`

argument type mismatch异常

阅读更多

一,在action中:

        CustomerActionForm  caf =(CustomerActionForm)form;
        Customer customer = new Customer();
        BeanUtils.copyProperties(customer, caf);
        customerManager.addCustomer(customer, 0);

    出现了argument type mismatch异常,原因是由于,我的代码中有date类型,在提交时是作为String类型来提交的,无法自动转换为date类型导致的匹配不一致。

二,解决的方法一:(参考文章:浅析J2EE应用中的时间值字段的数据类型

                  引用地址:http://dev.yesky.com/44/2468044_1.shtml)

    在actionForm中设本为Date类型的为String,因为数据提交上来就是String类型

   ·CHAR类型日期

  由于User.expireDate也是String类型,因此,仅需要将 UserActionForm.expireDate属性完全拷贝到User中,然后再将User.expireDate属性的日期格式符"-"去除却 可,却将2006-06-06转换为20060606,对应操作逻辑的主要代码如下:

1. User user = new User();
2. //将userActionForm中的数据拷贝到user对象中
3. BeanUtils.copyProperties(user, userActionForm);
4. //将日期格式符去除,得到数据库存储 日期格式,如将2006-06-06转换为20060606
5. user.setExpireDate(user.getExpireDate().replace("-",""));
6. …
7. //调用服务对象,将user保存到T_USER中
8. userService.save(user);


  ·DATE类型日期

   在DATE类型日期方案中,由于PO User.expireDate属性为java.sql.Date,和UserActionForm.expireDate 存在类型的不匹配,因此需要通过一个转换函数,将String日期转换为java.sql.Date的日期。其主要代码如下:

1. User user = new User();
2. //由于expireDate不能直接进行拷贝,因此需要逐一拷贝属性
3. BeanUtils.copyPropertie(user, userActionForm,"userId");
4. BeanUtils.copyPropertie(user, userActionForm,"userName");
5. //使用转换函数str2Date()将String类型的时间转换为java.sql.Date的时间
6. java.sql.Date expireDate = str2Date(userActionForm.getExpireDate());
7. //设置expireDate属性
8. user.setExpireDate(expireDate);
9. …
10. //调用服务对象,将user保存到T_USER中
11. userService.save(user);


  通过上面的比较,可以看出,使用DATE时间方案比使用CHAR时间方案在添加数据的处理上要复杂一些,表现在:

   1) 由于属性名相同而类型存在不可直接转换的问题将导致无法进行对象间属性批量拷贝,即BeanUtils. copyProperties()批量属性拷贝函数会抛出异常,因此只能手工逐一进行单个具体属性的拷贝,如果属性个数很多,这一机械式的属性拷贝代码块 就要相应增大,不但使代码显示臃肿难看,而且直接降低了代码的可维护性,因为一但因表字段名改变,就需要手工调整这段代码。

  2) 需要提供一个将String日期串转换为java.sql.Date的转换函数,将年、月、日时间域分别从字串中抽取出来,并转换为int类型,然后利用 java.sql.Date(int year,int month,int date)构造函数得到对应的java.sql.Date对象

三,网上看了别人的总结

http://hi.baidu.com/hankers/blog/item/6b316c63a2ec4a640d33fa61.html/cmtid/d6035cb505a1acc636d3cae9

如下:

现象:
    当输入页面中含有日期如2008-01-01时,如果Form中对于的字段为Date类型,则会出现“argument type mismatch”错误。

原因:
    Struts的ActionServlet在接受到页面的请求后,会调用RequestUtils.populate方法对Form进行填值,而此方法又 调用到BeanUtils.populate方法,而该方法进行填值时对不同类型的会进行转换,而默认的ActionServlet并没有注册相应的转换 函数,所以会导致转换出现错误。

解决方法:
    1.Form中的日期类型使用String类型,在Action中自己处理类型转换(即在Action中对Form->POJO转换时手工处理)。
    2.Form中使用java.util.Date类型,自定义一个日期转换类DateConverter(需要实现Converter接口),然后在自定 义的ActionServlet或者Action基类中注册DateConverter:ConvertUtils.register(new DateConverter(), Date.class)。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics