Asignaciones avanzadas de comodines Los parámetros no se encuentran en el método Prepare ()

De la documentación: asignaciones de comodines avanzados de Struts2 :

Comodines avanzados

Desde 2.1.9+ se pueden definir expresiones regulares definidas en el nombre de la acción. Para usar esta forma de comodín, se deben establecer las siguientes constantes:

   

Las expresiones regulares pueden tener dos formas, la más simple es {FIELD_NAME} , en cuyo caso el campo con FIELD_NAME en la acción se completará con el texto coincidente, por ejemplo:

   /books/content.jsp   

En este ejemplo, si se solicita url /fiction/content/Frankenstein , el campo ” type ” de BookAction se establecerá en ” fiction “, y el campo ” title ” se establecerá en ” Frankenstein “.

Esto es absolutamente genial, y funciona bien si lee esas variables en un método de acción regular, como execute() .

Si intentas leerlos del método prepare() , son nulos, porque el PrepareInterceptor ejecuta antes que los otros Interceptores responsables de establecer los parámetros; la forma habitual de resolver este problema es utilizar la Pila de interceptores adecuada para obtener los parámetros ya completados cuando se ejecuta el método de prepare()

De la documentación: ParamsPrepareParamStack

  

Esto funciona muy bien para los parámetros que vienen de la página, pero no funciona para los parámetros establecidos por Advanced Wildcards . Ellos todavía son nulos.

Cómo resolver este problema ?

Los parámetros no los establece el ParámetroInterceptor (como los que provienen del JSP), sino el StaticParametersInterceptor .
Para completar el método prepare() , se debe aplicar el mismo truco de paramsPrepareParamsStack .
Como no hay una stack de interceptor que lo haga desde el primer momento , debe definirlo.
Comenzando desde la defaultStack , debemos crear una Pila como esta:

          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 no es necesario, solo se incluye para usos futuros.

Comente en caso de que descubra algún problema relacionado con esto. AFAIK, funciona a la perfección.