日期:2014-05-17  浏览次数:20747 次

restfull风格的Struts2,form提交时没有执行指定的方法
一个奇怪的错误,form提交的时候只会调用默认的方法,而不会调用指定的search()方法.
异常:
java.lang.NoSuchMethodException: com.zweb.www.admin.action.SysAccountAction.create()
。。。。。
。。。。。
2014-01-19 21:54:22,276 WARN  com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.warn:64 - com.zweb.www.admin.action.SysAccountAction.create()
之前用的是struts2.1.8.1,现在是struts2.3.15.3.在相同的配置下,之前可以正常运行,版本升级之后出错。
相关代码,配置
jsp页面:
<form name ="form" id = "form" method="post" action="<s:url value="/sys_account!search" />">

类SysAccountAction(没有create()方法):
public String search(){
   return "index";
}
struts.xml(主要相关配置):
<constant name="struts.convention.action.suffix" value="Action" />
<constant name="struts.convention.default.parent.package" value="admin-default" />
(此处admin-default继承了rest-default)
<constant name="struts.convention.package.locators" value="action" />
<constant name="struts.convention.action.name.separator" value="_" />

pom.xml:struts2-rest-plugin,struts2-convention-plugin已经添加。

官方文档中提示:
       This Restful action mapper enforces Ruby-On-Rails Rest-style  mappings. If the method is not specified (via '!' or 'method:' prefix), the method is "guessed" at using ReST-style conventions that examine the URL and the HTTP method. Special care has been given to ensure this mapper works correctly with the codebehind plugin so that XML configuration is unnecessary.

最关键的是,相关的配置什么的在2.1.8.1版本的时候都可以正常使用,但是升级之后就不行了,这是什么原因,哪里错了,或者我应该从哪个方向查找原因


------解决方案--------------------
第一个问题,楼主的struts.xml中貌似缺少了动态调用的许可设置
<!-- 使用动态方法调用前必须设置struts2允许动态方法调用。
  开启系统的动态方法调用是通过设置struts.enable.DynamicMethodInvocation常量完成的,
  设置该常量值为true, 将开启动态方法的调用;否则将关闭动态方法调用。 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />

第二个问题,create方法是自己写的呢还是之前jar包里面继承的,如果是继承的,那可能就是jar升级过程中把这个方法拿掉了。楼主可以对比下自己继承的类检查检查,必要的话,自己再加上去。