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

これはStrict Method Invocationであり、Struts 2.5 以降ではデフォルトで有効になっています。

SMI とワイルドカード マッピングに関するドキュメントから:

アクションの定義でワイルドカード マッピングを使用すると、SMI は次の 2 つの方法で動作します。

  • SMI は無効です。ワイルドカードはデフォルトの RegEx に置き換えられます。つまり、:<action name="Person*" method="perform*">は に変換されallowedMethod = "regex:perform([A-Za-z0-9_$]*)"ます。
  • <allowed-method/>SMI が有効です - ワイルドカード置換は行われません。注釈またはタグによってアクセスできるメソッドを厳密に定義する必要があります。

ごとに無効にすることができます<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アノテーションもあります。

package-info.javaこの注釈は、すべてのサブパッケージに対してグローバルに許可されたメソッドを指定するために、Action クラスまたはクラスで直接使用できます。

于 2016-05-13T20:50:29.680 に答える