问题描述:
在 Struts2 里面,当页面向服务器提交参数时报 ognl.MethodFailedException 和 java.lang.NoSuchMethodException: setMoney([Ljava.lang.String;)] 异常,实际上 money 并不是 String 类型,而是 float 类型或者其他类型,但是参数值却仍能够正确传递过去。
异常信息 :
ognl.MethodFailedException: Method "setMoney" failed for object com.yakoo5.cdhms.action.SaleManageAction@221c75 [java.lang.NoSuchMethodException: setMoney([Ljava.lang.String;)]
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:823)
at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:964)
at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:75)
…
…
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
/--------------------------------------/
expr: money val: [Ljava.lang.String;@1f87254 context: ognl.OgnlContext@d0a0b718 root:[com.yakoo5.cdhms.action.SaleManageAction@221c75, com.opensymphony.xwork2.DefaultTextProvider@618533] value: [Ljava.lang.String;@1f87254
注: money 是 SaleManageAction 的一个属性字段 ,float 类型 . 。
解决办法:
将 money 的类型修改为 Float 类型 ( 包装类型 ) ,并且 getter , setter 方法的返回类型和参数类型都要修改成 Float 类型。即可解决此问题。
还有,如果你要传递的参数时 Struts2 的 Action 的属性对象的子属性,如: SaleManageAction.SaleRecord.money , money 是 float 类型,最好也改成 Float 类型,不然会报同样的错误。
建议: 只要从页面传递的参数是 Struts2 的 Action 的属性或者属性对象的子属性,都把它们的类型从原始类型 (int,float,double) 修改改成包装类型 (Integer,Float,Double) ,当然它们的 setter 和 getter 方法的参数和返回值也要修改成包装类型,这样就可以避免不必要的此类异常。