在我的项目中,我在struts.xml
<action name="searchTracker" class="searchAction" method="searchTracker">
<result name="success">/jsp/searchTracker.jsp</result>
<result name="error">/jsp/searchTracker.jsp</result>
</action>
这是我在searchAction Action中的动作方法
public String searchTracker(){
this.clearErrorsAndMessages();
List<File> queryResults = fileManager.retrievequeryResults(patchNumBySearch); // patchNumBySearchis input from the page
if(queryResults == null){
this.setTrackers(null);
addActionError("This patch number doesn't exist. Please choose another one !");
return ERROR;
}
List<Tracker> trackers = commonUtils.convertToTrackers(queryResults);
this.setTrackers(trackers);
}
return SUCCESS;
}
如果我输入错误的参数并且queryResult
返回为NULL
,页面searchTracker.jsp
可以按照我的意愿正确显示错误消息,但在此之后,我输入正确的参数,它直接在
"Errors on action com.harris.northstar.dbadesk.action.SearchTrackerAction@9bee3a, returning result name 'input'"
我只是比较了两种不同情况下的调试日志,发现只有一行差异
"converter is null for property patchNumBySearch. Mapping size: 0"
如果该行存在,它将进入我的操作,如果不存在,它将转到错误请求输入结果。这是什么意思?
并没有进入动作类。我知道原因是它违反了一些默认的验证拦截器并抛出了这个异常,但我发现这个请求有正确的参数没有任何问题。如果我首先输入正确的参数,它可以获得queryResult并且无问题地转到Success结果。唯一不同的是时机。
我是否必须在配置xml中添加输入结果?我之前遇到过一些项目,他们只有成功和错误结果,根本没有输入结果,为什么它不起作用?我的struts.xml出了什么问题?
我不想通过禁用struts默认验证拦截器来创建我自己的拦截器
我刚刚找到了一种绕行的方法。只是删除配置文件中的错误结果,只保留成功结果,并删除方法searchAction中的AccionErrors,这样用户就不会收到任何关于查询请求的警告消息,只是在页面上没有显示任何内容,但这种方式是次要选项。我仍然希望通过解决此问题来显示错误消息。
答案 0 :(得分:0)
在将控件转移到操作方法之前,如果发生验证错误,将调用input
结果。在这种情况下,我建议您为初始jsp定义结果类型input
,并尝试分别使用<s:fielderror />
和<s:actionerror />
打印fielderrors和actionerros。这将为您提供更好的前景,您将了解如何在下一步中处理此问题,具体取决于错误类型。