Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wildcard Action Mapping no longer working after updating to Struts 2.5

I have the following action mapping in my application's struts.xml, which was working just fine with Struts 2.3.28.1; calls to the /editApplication action where being handled by the x.ApplicationHandler.edit method.

<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>   

After upgrading to Struts 2.5, this no longer works. Attempting to call the /editApplication action shows the 404 error:

HTTP Status 404 - There is no Action mapped for namespace [/] and action name [editApplication]

I've reviewed the Struts 2.5 release notes, and don't see any mention of updates to the way wildcard based action mapping works. Is there any reason why this configuration no longer works?

like image 615
john Avatar asked May 13 '16 20:05

john


1 Answers

It is Strict Method Invocation and since Struts 2.5 it is enabled by default.

From the docs about SMI and wildcard mappings:

When using wildcard mapping in actions' definitions SMI works in two ways:

  • SMI is disabled - any wildcard will be substituted with the default RegEx, ie.: <action name="Person*" method="perform*"> will be translated into allowedMethod = "regex:perform([A-Za-z0-9_$]*)".
  • SMI is enabled - no wildcard substitution will happen, you must strictly define which methods can be accessed by annotations or <allowed-method/> tag.

You can disabled it per <package>.

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

OR you can add allowed methods names per action using <allowed-methods> tag.

<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>

OR add allowed methods names per package using <global-allowed-methods> tag.

<package extends="struts-default">

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

</package>

NOTE In order to use above tags in struts.xml you must update DTD definition to 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>

There is also @AllowedMethods annotation in struts2-convention-plugin which allows actions to specify allowed action methods.

This annotation can be used directly on Action classes or in the package-info.java class in order to specify global allowed methods for all sub-packages.

like image 130
Aleksandr M Avatar answered Oct 24 '22 16:10

Aleksandr M