2016-05-13 5 views
6

У меня есть следующее отображение действий в приложении struts.xml моего приложения, которое отлично работает с Struts 2.3.28.1; вызывает действие /editApplication, где обрабатывается метод x.ApplicationHandler.edit.Подстановочные файлы Действие больше не работает после обновления Struts 2.5

<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 Status 404 - There is no Action mapped for namespace [/] and action name [editApplication]

Я рассмотрел распорок 2.5 примечания к выпуску, и не вижу какие-либо упоминаний о новинках в пути подстановочных на основе сопоставления действий работ. Есть ли причина, по которой эта конфигурация больше не работает?

+2

Это из-за SMI, как уже объяснил Александр, и он делает то, что если метод не разрешен, исключение вызывается с отсутствующим методом. Интересно, было бы лучше бросить исключение с «Этот метод не разрешен», wdyt? –

+0

Да, более значимым исключением может быть очень полезно здесь. – john

+1

Я зарегистрировал проблему, касающуюся этого https://issues.apache.org/jira/browse/WW-4640 –

ответ

14

Это Strict Method Invocation, а так как Struts 2.5 включен по умолчанию.

Из документов о SMI и подстановочные отображений:

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.

Вы можете отключили его в <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> 

Существует также @AllowedMethods аннотаций в struts2-convention-plugin, которая позволяет выполнять действия, чтобы указать разрешенные методы действий.

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.