Parametri di mapping jolly avanzati Parametri non trovati nel metodo Prepare ()

Dalla documentazione: i mapping di wildcard avanzati di Struts2 :

Caratteri jolly avanzati

Da 2.1.9+ è ansible definire espressioni regolari definite nel nome dell’azione. Per utilizzare questa forma di jolly, è necessario impostare le seguenti costanti:

   

Le espressioni regolari possono essere in due forms, la più semplice è {FIELD_NAME} , nel qual caso il campo con il campo FIELD_NAME nell’azione verrà popolato con il testo corrispondente, ad esempio:

   /books/content.jsp   

In questo esempio, se viene richiesta l’url /fiction/content/Frankenstein , il campo ” type ” di BookAction sarà impostato su ” fiction ” e il campo ” title ” sarà impostato su ” Frankenstein “.

Questo è assolutamente ottimo, e funziona bene se leggi queste variabili in un normale metodo di azione, come execute() .

Se si tenta di leggerli dal metodo prepare() , sono nulli, poiché PrepareInterceptor viene eseguito prima degli altri responsabili di Interceptors per l’impostazione dei parametri; il solito modo per risolvere questo problema è usare l’apposito Stack di Intercettazione per ottenere i parametri già popolati durante l’esecuzione del metodo prepare()

Dalla documentazione: ParamsPrepareParamStack

  

Funziona alla grande per i parametri provenienti dalla pagina, ma non funziona per i parametri impostati da Advanced Wildcards . Sono ancora nulli.

Come risolvere questo problema ?

Tali parametri non sono impostati da ParametersInterceptor (come quelli provenienti dal JSP), ma da StaticParametersInterceptor .
Per averli compilati nel metodo prepare() , deve essere applicato lo stesso trucco di paramsPrepareParamsStack .
Dal momento che non esiste una pila di intercettori che lo faccia immediatamente , è necessario definirlo.
Partendo da defaultStack , dovremmo creare uno Stack come questo:

          dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*             dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*    input,back,cancel,browse   input,back,cancel,browse    

Nota: ActionMappingParams non è necessario, solo incluso per usi futuri.

Si prega di commentare nel caso in cui si scopre qualsiasi problema correlato a questo. AFAIK, funziona perfettamente.