【问题标题】:Struts 2 workflow interceptor and actions that do not have an INPUT resultStruts 2 工作流拦截器和没有 INPUT 结果的操作
【发布时间】:2026-02-15 19:45:01
【问题描述】:

如果我理解 Struts 2 拦截器堆栈正确,工作流拦截器会查看验证拦截器是否报告了任何验证失败。如果它发现已经验证失败,它返回(默认)Action.INPUT

如果是这种情况,如果正在执行的操作在其struts.xml 配置中没有定义INPUT 结果会怎样?

【问题讨论】:

  • 这似乎很容易通过尝试确定,但希望它也相当明显——你会收到一个错误,说结果未定义。全局结果有助于捕捉这些内容并至少呈现用户可以理解的内容,但如果发生这种情况,它就是开发级别的错误。

标签: java struts2 workflow struts2-interceptors


【解决方案1】:

如果它返回 INPUT,并且没有为此定义结果(也没有一般结果),你会得到一个错误页面,上面写着类似

 No result defined for type INPUT and action <action name>.

您可以定义一个将始终显示为“INPUT”的通用页面,但更好的解决方案是,如果您有一个 validate() 方法,通常最好定义一个 INPUT 结果返回。即使您没有明确进行任何验证,将非整数值传递给整数字段之类的事情也会导致该结果,因此最好定义它。

【讨论】:

    【解决方案2】:

    您可以使用ValidationWorkflowAware 接口来定义每个操作的结果名称

    您可以使用InputConfig 注解以编程方式更改每个操作的结果名称

    随着即将发布的 Struts 2.3.15 版的新版本,也可以使用ValidationErrorAware 接口,可以通知操作错误并可以更改返回的结果名称:https://issues.apache.org/jira/browse/WW-4071

    【讨论】:

      【解决方案3】:

      默认使用INPUT结果,您可以随时通过设置拦截器inputResultName的参数来覆盖它。

      <interceptor-ref name="workflow">
         <param name="inputResultName">error</param>
      </interceptor-ref>
      

      进一步澄清和参考workflow interceptor

      在上面的示例中,操作没有INPUT 结果,如果发现操作错误或字段错误,则结果ERROR 将返回。

      【讨论】: