8

我的应用程序中有以下动作映射struts.xml,它与 Struts 2.3.28.1 配合得很好;调用/editApplication由该x.ApplicationHandler.edit方法处理的操作。

<action name="*Application" class="x.ApplicationHandler" method="{1}">
    <result name="input">/WEB-INF/application.jsp</result>
    <result name="success" type="redirectAction">
        <param name="actionName">browseApps</param>
    </result>
</action>   

升级到 Struts 2.5 后,这不再有效。尝试调用该/editApplication操作会显示 404 错误:

HTTP 状态 404 - 没有为命名空间 [/] 和操作名称 [editApplication] 映射操作

我查看了 Struts 2.5 发行说明,并没有看到任何关于基于通配符的操作映射工作方式的更新。这种配置不再起作用有什么原因吗?

4

1 回答 1

21

它是严格的方法调用,从 Struts 2.5 开始默认启用。

从有关 SMI 和通配符映射的文档中:

在操作定义中使用通配符映射时,SMI 以两种方式工作:

  • SMI 被禁用 - 任何通配符都将替换为默认的 RegEx,即:<action name="Person*" method="perform*">将被翻译成allowedMethod = "regex:perform([A-Za-z0-9_$]*)".
  • 启用 SMI - 不会发生通配符替换,您必须严格定义注释或<allowed-method/>标记可以访问哪些方法。

您可以禁用它<package>

<package strict-method-invocation="false">

<allowed-methods>或者,您可以使用标签为每个操作添加允许的方法名称。

<action name="*Application" class="x.ApplicationHandler" method="{1}">
    <result name="input">/WEB-INF/application.jsp</result>
    <result name="success" type="redirectAction">
        <param name="actionName">browseApps</param>
    </result>

    <allowed-methods>firstMethod, secondMethod, thirdMethod</allowed-methods>
</action>

<global-allowed-methods>或者使用标签为每个包添加允许的方法名称。

<package extends="struts-default">

    <global-allowed-methods>firstMethod, secondMethod, thirdMethod</global-allowed-methods>

</package>

注意为了在 struts.xml 中使用上述标签,您必须将 DTD 定义更新为2.5.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
        "http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
...
</struts>

struts2-convention-plugin中还有一个@AllowedMethods注解,它允许动作指定允许的动作方法。

这个注解可以直接用在 Action 类或package-info.java类中,以便为所有子包指定全局允许的方法。

于 2016-05-13T20:50:29.680 回答