2016-05-13 19 views
6

Ho il seguente mapping di azioni in struts.xml della mia applicazione, che funzionava perfettamente con Struts 2.3.28.1; chiama all'azione /editApplication dove viene gestito dal metodo x.ApplicationHandler.edit.Il mapping di azioni jolly non funziona più dopo l'aggiornamento a 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> 

Dopo l'aggiornamento a Struts 2.5, questo non funziona più. Il tentativo di chiamare l'azione /editApplication mostra l'errore 404:

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

ho rivisto le Struts 2.5 note di rilascio, e non vedo alcuna menzione aggiornamenti di lavori di mappatura azione basate modo jolly. C'è qualche ragione per cui questa configurazione non funziona più?

+2

E 'a causa della SMI, come già spiegato da Aleksandr ed è fare il fatto che se il metodo non è consentito viene generata un'eccezione con il metodo mancante. Mi chiedo se sarebbe meglio gettare un'eccezione con "Questo metodo non è permesso", wdyt? –

+0

Sì, un'eccezione più significativa potrebbe essere molto utile qui. – john

+1

Ho registrato un problema per coprire questo https://issues.apache.org/jira/browse/WW-4640 –

risposta

14

È Strict Method Invocation e poiché Struts 2.5 è abilitato per impostazione predefinita.

Dalla documentazione circa SMI e mappature jolly:

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.

È possibile disabilitato per <package>.

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

oppure è possibile aggiungere consentiti metodi di nomi per azione utilizzando <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> 

OPPURE aggiungere i nomi dei metodi consentiti per pacchetto utilizzando il tag <global-allowed-methods>.

<package extends="struts-default"> 

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

</package> 

NOTA Per poter utilizzare i tag di cui sopra in struts.xml è necessario aggiornare la definizione 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> 

C'è anche @AllowedMethods annotazione nei struts2-convention-plugin che permette azioni per specificare i metodi di azione consentiti.

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.