一,在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)。
分享到:
相关推荐
NULL 博文链接:https://xgia7.iteye.com/blog/691889
Grails是一套用于快速Web应用开发的开源框架,它基于Groovy编程语言,并构建于Spring、Hibernate和其它标准Java框架之上,从而为大家带来一套能实现超高生产力的一站式框架。 本书作者 Jason Rudolph 译者 陈俊 林...
TypeError: loop of ufunc does not support argument 0 of type Tensor which has no callable arctan method 报错行 self.u = np.round(np.dot(self.F, self.u)) #或者 self.u = np.round(self.u + np.dot(K, ...
ARGUMENT GRE ARGUMENT GRE ARGUMENT GRE ARGUMENT GRE ARGUMENT GRE ARGUMENT GRE ARGUMENT GRE ARGUMENT GRE ARGUMENT GRE
Variable-length Argument Lists
argument用法
keil升级5.25pre(临近几个...会提示Error: Encountered an improper argument 主要解决办法就是替换UV4.exe,可以将低版本中的UV4.exe直接替换 具体操作看:https://blog.csdn.net/u011624093/article/details/80880708
GRE作文argument全部官方范文分析
fragment argument有关简介与使用
Reading Literature and Writing Argument
翻译过来是类型为“type”的TypeError对象没有len(),我报错的代码是: #coding=utf-8 print(请输入一个字符串:) a = input('') #回文的长度至少为2 if len(str) < 2: print('请不要输入空字符串!') a = ...
简单粗暴写好Argument 模板提供 详细讲解
这是原汁原味的北美教程,教你如何写出美国人看着顺眼的argument
某台机器上,访问公司的好几个产品网站,都抛出很多 Invalid procedure call or argument ,跟进了下,情况最后简化为
format ' x' invalid or incompatible with argument 解决办法
Argument 模板 完美,By András From Beijing Foreign Studies University
Keil v5 Error: Encountered an improper argument 个人实测解决办法 实测运行正常咯,再也不出现仿真关不了debug情况了
OpenCV 报错“Unknown array type in function cvarrToMat” 并崩溃
Error Encountered an improper argument 真实测试过
Argument.doc