在CentOS 7.0环境中,使用Struts 2框架时,出现如下异常
[2019-01-09 16:25:01.805][WARN][OgnlValueStack.warn] Error setting expression 'fid' with value '[Ljava.lang.String;@75bd0b76'
ognl.MethodFailedException: Method "setFid" failed for object com.cnsunet.presentation.performance.TcpServiceAction@2ac34074 [java.lang.NoSuchMethodException: setFid([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 ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:131)
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:28)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:1656)
at com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor.setProperty(CompoundRootAccessor.java:65)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:1656)
at ognl.ASTProperty.setValueBody(ASTProperty.java:101)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:177)
at ognl.SimpleNode.setValue(SimpleNode.java:246)
at ognl.Ognl.setValue(Ognl.java:476)
at com.opensymphony.xwork2.ognl.OgnlUtil.setValue(OgnlUtil.java:198)
at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:161)
at com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:149)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.setParameters(ParametersInterceptor.java:276)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:187)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
但整个模块的功能并没有受到影响,一切正常运行。
然后,我在本地进行代码调试,发现也是正常的,连该异常error信息都没有复现。
最后到网上搜索资料,终于定位到问题所在,并解决!
出现该errror一般是在client请求server时,传的参数有问题而产生的
有两种情况:
- action类中,没有某个参数的get/set方法。
- action类中,有某个参数的get/set的方法,但是在set方法中,形参的类型与client传过来的类型不一致。
第一种大家都清楚,这里说下第二种:
public void setFid(long fid) {
this.fid = fid;
}
比如以上代码,形参fid为long型,如果client传的参数为String型,就会出现异常error。
因此,对于client传参的类型一定要与server的一致,避免隐晦的错误!