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