Error setting value Method "setAge" failed for object ..Ljava.lang.String 错误总结

Error setting value Method "setAge" failed for object ..Ljava.lang.String 错误总结

(2012-02-01 11:01:46)
标签: 

struts

 

error

 

setting

 

value

 

空值

 

提交

 

参数

 

it

 

以下应该是一些朋友在使用Struts2.1以上版本进行demo时经常遇到的错误提示。

Error setting value
ognl.MethodFailedException: Method "setAge" failed for object com.test.action.RegisterAction@d6b059 [java.lang.NoSuchMethodException: setAge([Ljava.lang.String;)]

 

下面以age为例,即在XXAction和对应前台页面中有一个name="age"的区域

XXAction中包含:private int age;

情形描述:在表单空值提交时,按照预期,Struts2应该会把提交的类型为String的age区段,自动的转化为我们声明的int类型的值。当我们提交的为空值时,默认为0. 如果填写非法值,如abc或者-1或者500时,应该由XXAction.properties以及XXAction中的validate()方法来校验。

 

实际情况:实际上,当我们进行空值提交时,往往会出现上面那段"Error setting value"的错误提示,虽然提交之后,相应区域仍能够设置为0,但是这样的错误提示往往让我们很不爽。

 

情况分析:下面我们进行一下流程分析。(部分引用网友分析)
struts2的流程是:
获取客户端请求参数--->直接就转换成我们要的数据类型(由于没有校验,这一步可能导致转型时异常产生)------>校验参数是否合法.

 

那么,之所以会有这样的问题,是因为在Struts2.1x以上的版本中,Struts2将""视为空串,而不是null,所以就会出现Ljava.lang.String这样的类型,如果朋友有兴趣执行这样一段代码的话:

System.out.println(String[].class);

会发现,打印结果就是:

Ljava.lang.String

即空区域被视为字符串,所以在进行类型转换(String[] 到 int时)就会报警告。

 

这里,我暂时提供一种消除警告的办法,那就是在声明age时,将其声明为:

private String age;

相应的get set方法为:

 

 public String getAge() {
  return age;
 }
 public void setAge(String age) {
  if("".equals(age) || age == null) {
   this.age = "0";
  } else {
   this.age = age;
  }
 }

 

那么,有的朋友会说这样比较坑爹,放着Struts2的便利类型转换不用,非要手动转换,岂不是呆子- -。

有一定的道理,但是,框架毕竟只是一种手段,如果我们不能做到每一步都自己控制,而只依赖它,那么当程序真正出现大的错误时,我们就很难找到错误原因。

 

下面,就Struts2的一些特性进行一些分析:

1.在Action当中,如果我们所有接收客户机传递参数的变量都是String类型的话,那么程序没问题。但这样就相当于程序根本没有利用到struts2的内置类型转换机制。因为客户机传进来的数据本来就全是String的。

2.就是我们在Action当中定义了Integer,Double,Date等参数接收客户机提交的参数,但此时客户机提交的参数如果格式有问题则后台报错。

 

另外,我们重写我们所需要的所有类型转换器,然后再里面转换,出异常的话自己catch住,然后自己生成FieldError,然后调用INPUT。这也是可以解决这个问题的一个方法。

 

综上:朋友遇到一些问题时,可以用一些符合自己习惯的解决方式,框架毕竟是工具,如果有些处理不符合自己的预期,那么干脆不用某些特性。

以上为我的一点感触,希望能帮助大家。

 

 

===================华丽丽的分割线======================================

经过再一次的实验,上述解决办法对于正确的输入有效,但对于字符转数字这样的错误,会出现问题。

所以,虽然会出现后台报警,但在不影响使用的情况下,可以坚持对变量声明相应的类型,数字就声明称int或者浮点等。

转地址http://blog.sina.com.cn/s/blog_69b9434b01012ke1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值