ognl.MethodFailedException: Method "setEndtime" failed for object com.piptrade.action.tradetools.eCalerddarAction@17db177 [java.lang.NoSuchMethodException: setEndtime([Ljava.lang.String;)]
简单分析,通过form提交过来的endtime是String类型的,而action里的endtime不是String类型,这个Endtime对应的setEndtime方法的参数类型不是String了,估计这个是Date吧。
据了解,struts2有默认的类型转的,基本类型都可以转换的
boolean和Boolean:完成字符串和布尔值之间的转换;
char和Character:完成字符串和字符之间的转换;
int和Integer:完成字符串和整形之间的转换;
long和Long:完成字符串和长整形之间的转换;
flota和Float:完成字符串和单精度浮点值之间的转换;
double和Double:完成字符串和双精度浮点值的转换;
Date:完成字符串和日期类型之间的转换!;
数组:默认情况下,数组元素是字符串,如果用户提供了自定义类型转换器,也可以是其他复合类型转换器;
集合:默认情况下,假定集合元素为String,并创建一个新的ArrayList封装所有的字符串;
这样即使endtime是Date类型,也没问题的。
但是如果传进来带有非法字符的话,这里也会报错的,如age是int,而在页面传值是传了个字符串过来,这样肯定报错了。
有一种特殊的情况。
项目上有出现表现层使用实体类的情况,将实体类对象放到表单中获取数据,其中涉及到starttime的属性,这个属性是timestamp类型的。
在本地开发环境下,页面通过表单提交starttime的值到action是没问题的,这里应该是做了一次转换,将String转为了timestamp。
但是放到商用上,就报错上面的错误了。
后来将服务器的一个环境变量Lang改为了zh_CN.UTF-8,跟本地的一样,就没有报错了。原来的是en_US.UTF-8。
看得出是服务器的字符编码导致的。struts的转换是没问题的,猜测是不是两种字符编码的时间格式不一样呢?浏览器在本地,应该是中文的,服务器的应该也是中文才行。
需要进一步的验证。