`

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)。

分享到:
评论

相关推荐

    Cannot invoke setId on bean class 'class ' - argument type mismatch - had object

    标题 "Cannot invoke setId on bean class 'class ' - argument type mismatch - had object" 描述的是一个在使用Spring框架或者类似的依赖注入容器时常见的错误。这个错误通常发生在尝试通过容器设置一个对象属性,...

    javaweb编程中常见的异常及处理方法.doc

    本文将重点介绍一种常见的异常——`java.lang.IllegalArgumentException: argument type mismatch`,并详细解析其成因与解决策略。 #### 异常示例 在JavaWeb项目中使用Struts框架时,可能会遇到如下异常: ```java...

    java上传文件资料

    - argument type mismatch`。这个问题通常发生在试图将某个对象(例如Date类型)设置到表单(Form)中,但对象类型与预期的不匹配。下面我们将详细探讨这个问题以及如何解决。 首先,当表单字段是Date类型,并且...

    WEB开发报错处理集锦

    8. java.lang.IllegalArgumentException: Cannot invoke com.tj.olympic.struts.form.SubmitUpdateStuffTimeRecordForm.setOccurDate - argument type mismatch 这是一个Java异常,表示方法参数类型不匹配。解决...

    Struts常见错误汇总

    argument type mismatch **问题描述:** 在使用 Struts 提供的 HTML 表单标签库时,如果标签参数类型与预期不符,则会抛出此异常。 **解决方法:** - 检查 HTML 标签的参数类型是否与实际传递的数据类型一致。 - ...

    java和JavaScript开发细节

    3. **类型不匹配异常:** JavaScript中经常会出现类型不匹配的异常,如`java.lang.IllegalArgumentException: argument type mismatch`,这通常是因为函数调用时传递的参数类型不符合预期。 4. **HTML元素与...

    fortran常见错误及其原因

    ### Fortran常见错误及其原因分析 ...通过以上分析,我们可以看到这些常见的Fortran错误涉及从编译时错误到运行时异常的各种情况。理解这些错误的原因并采取相应的措施进行修复是编写健壮、高效的Fortran程序的关键。

    编译器中文翻译

    **Type mismatch in parameter xxx —— 参数xxx类型不匹配** - **解释**:函数调用时传入的参数类型与函数声明中指定的类型不符。 - **示例**:若函数声明为`void func(int a)`,则调用时应传递整型参数。 18. ...

Global site tag (gtag.js) - Google Analytics