struts2.1.8 <---->struts2.0.14

JustWhat 2010-06-11 01:26:38
1.jsp <s:form action="register"><s:textfield name="age" label="age"></s:textfield>
<s:submit value=" submit "></s:submit>
</s:form>
public class RegisterAction extends ActionSupport {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String execute() throws Exception {
return SUCCESS;
}
}

struts.xml
<action name="register" class="com.test.action.RegisterAction">
<result>/success.jsp</result>
<result name="input">/register.jsp</result>
</action>

问题:
输入非数字,提交
当使用2.0.14的struts jar包时,不报错,直接跳回1.jsp
当使用2.1.8的struts jar 包时,tomcat console 出现错误。
2010-6-11 1:24:34 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: Error setting expression 'age' with value '[Ljava.lang.String;@f77511'
ognl.MethodFailedException: Method "setAge" failed for object com.test.action.RegisterAction@151ac10 [java.lang.NoSuchMethodException: com.test.action.RegisterAction.setAge([Ljava.lang.String;)]
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1265)
at ognl.OgnlRuntime.setMethodValue(OgnlRuntime.java:1454)
at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:85)
at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:162)
at com.opensymphony.xwork2.ognl.accessor.ObjectAccessor.setProperty(ObjectAccessor.java:28)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
at com.opensymphony.xwork2.ognl.accessor.CompoundRootAccessor.setProperty(CompoundRootAccessor.java:65)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2225)
at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)
at ognl.SimpleNode.setValue(SimpleNode.java:301)
at ognl.Ognl.setValue(Ognl.java:737)
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)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoSuchMethodException: com.test.action.RegisterAction.setAge([Ljava.lang.String;)
at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1206)
... 63 more
/-- Encapsulated exception ------------\
java.lang.NoSuchMethodException: com.test.action.RegisterAction.setAge([Ljava.lang.String;)
。。。
...全文
485 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
隋春羽 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 justwhat 的回复:]
action中没有private void setAge(String age)这个方法

即使添加了自定义的public void setAge(String age)这个方法

Java code
public void setAge(String age){
try{
this.age = Integer.parseInt(age);
……
[/Quote]早上刚发现百度就到这了 我觉得setAge方法应该这样
public void setAge(String age) {
if(!"".equals(age))
{
this.age = Integer.parseInt(age);
}
else{
this.age=0;
}
}
在以前的版本中如果age不填在action中age自动赋值为0 看来在2.1.8版本中不填是按照String处理了而通过反射去找setAge(String ...)没有找到所以出现java.lang.NoSuchMethodException: com.test.action.RegisterAction.setAge([Ljava.lang.String;)]错误啦。
还是觉得以前的比较好 ,当然最好的方式还是在前端加校验。当然如果你使用validate()绝对是不起作用的因为 set方法是在validate()执行之前执行的 所以只有在前端校验或用xml了
shenjichao2009 2010-06-26
  • 打赏
  • 举报
回复
我也遇到这种问题了,功能能够实现,但就是报异常!!!
我的qq是:897948924
jumpheightway 2010-06-11
  • 打赏
  • 举报
回复
从2.1.3开始差异就很大了
xiaochengfu1 2010-06-11
  • 打赏
  • 举报
回复
版本差异
izard999 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 justwhat 的回复:]
引用 6 楼 izard999 的回复:
引用 5 楼 justwhat 的回复:
虽然只是一个warning 但是怎么去掉啊?

首先我觉得你前端的数据本身就是要校验的.! 不管是客户端校验还是服务端校验,校验了再做action!
虽然只是一个warning,但是我觉得是你程序的漏洞, 你继承了ActionSupport,那么他会对类型转换进行校验, 而你又没有任何验证(validat……
[/Quote]
填充请求参数是paramsInterceptor做的. 这个错误肯定是这个里面来的.!
JustWhat 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 izard999 的回复:]
引用 5 楼 justwhat 的回复:
虽然只是一个warning 但是怎么去掉啊?

首先我觉得你前端的数据本身就是要校验的.! 不管是客户端校验还是服务端校验,校验了再做action!
虽然只是一个warning,但是我觉得是你程序的漏洞, 你继承了ActionSupport,那么他会对类型转换进行校验, 而你又没有任何验证(validate method/xml校验), 转换出错他……
[/Quote]
忽略客户端校验, 在服务器端的校验 重写validate method ,在做校验之前warning 就已经出来了啊。
从客户端过来的数据,struts 就已经自动的把客户端数据设到age 去。在调用setAge的时候出的warning。之后才调用vilidate method 啊
  • 打赏
  • 举报
回复
[java.lang.NoSuchMethodException: com.test.action.RegisterAction.setAge([Ljava.lang.String;)]

---
我看你的程序中有setAge方法呀。那么应该是jar包引起的编译错误了。
izard999 2010-06-11
  • 打赏
  • 举报
回复
你这个时候不管是哪种校验方式,都应该把错误信息提示给用户!
izard999 2010-06-11
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 justwhat 的回复:]
虽然只是一个warning 但是怎么去掉啊?
[/Quote]
首先我觉得你前端的数据本身就是要校验的.! 不管是客户端校验还是服务端校验,校验了再做action!
虽然只是一个warning,但是我觉得是你程序的漏洞, 你继承了ActionSupport,那么他会对类型转换进行校验, 而你又没有任何验证(validate method/xml校验), 转换出错他自然会跳到input视图的!
JustWhat 2010-06-11
  • 打赏
  • 举报
回复
虽然只是一个warning 但是怎么去掉啊?
JustWhat 2010-06-11
  • 打赏
  • 举报
回复
action中没有private void setAge(String age)这个方法

即使添加了自定义的public void setAge(String age)这个方法
public void setAge(String age){
try{
this.age = Integer.parseInt(age);
}catch(Exception ex){
System.out.println(ex.getMessage());
this.addFieldError("age", "input age is not a correct number");
}
}

还是一样啊? 怎么解决呢?
Java技术栈 2010-06-11
  • 打赏
  • 举报
回复
2010-6-11 1:24:34 com.opensymphony.xwork2.util.logging.commons.CommonsLogger warn
警告: Error setting expression 'age' with value '[Ljava.lang.String;@f77511'
ognl.MethodFailedException: Method "setAge" failed for object com.test.action.RegisterAction@151ac10 [java.lang.NoSuchMethodException: com.test.action.RegisterAction.setAge([Ljava.lang.String;)]

action中没有private void setAge(String age)这个方法
xieshengjun2009 2010-06-11
  • 打赏
  • 举报
回复
就是这样的, struts2.1.8 这个版本比较好,不容易出错,建议使用。
qiheia 2010-06-11
  • 打赏
  • 举报
回复
恭喜楼主发现版本差异~~~

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧