WebWork, bug al encadenar una acción con método
Sábado, 11 de Febrero de 2006Es bastante útil llamar a los métodos de las acciones directamente. Es decir, en vez de utilizar llamadas del tipo :
/app/User.action
Llamamos a un método directamente, así:
/app/User!create.action
Ahora bien, ?Qué sucede si, desde otra acción, deseamos encadenar (con un resultado type=”chain”) el resultado de una accion con otra, llamando a un método en concreto?
Por ejemplo así:
<action name="User" class="si.web.action.admin.UserAction">
<result type="chain" name="success">
<param name="actionName">User!list</param>
</result>
</action>
Pues que obtendremos un bonito error. WebWork no encuentra nuestra accion User!list porque, en el momento de buscarla, no quita el metodo del nombre de la acción. Es decir, no busca la accion “User” sino la accion “User!list”, y precisamente con ese nombre no existe. Pero tiene facil solución.
Hace ya unos dias que he reportado este bug en el Jira de Webwork pero hasta el momento no me han hecho mucho caso. Por si a alguien le pudiera interesar, se corrige así:
Tenemos que modificar la clase om.opensymphony.xwork.DefaultActionProxy.java
Para ello nos bajamos el código fuente de la versión de WebWork que estemos utilizando (a ser posible la última, aunque nunca se sabe), y metemos la clase en nuestro proyecto para poder modificarla. Del webwork.jar que utilicemos para desplegar, eliminamos la clase DefaultActionProxy.class, de esta manera nos aseguramos que solo se utilizará la que está corregida en nuestro proyecto por nosotros.
Buscamos el siguiente fragmento de código e insertamos las lineas que están entre los comentarios // START PATCH y // END PATCH
protected DefaultActionProxy(String namespace, String actionName, Map extraContext, boolean executeResult, boolean cleanupContext) throws Exception {
this.cleanupContext = cleanupContext;
if (LOG.isDebugEnabled()) {
LOG.debug("Creating an DefaultActionProxy for namespace " + namespace + " and action name " + actionName);
}
// START PATCH
int posExcl = actionName.indexOf("!");
if (posExcl > -1) {
this.method = actionName.substring(posExcl+1);
actionName = actionName.substring(0, posExcl);
}
// END PATCH
this.actionName = actionName;
this.namespace = namespace;
this.executeResult = executeResult;
this.extraContext = extraContext;
Lo único que hace el parche es asegurarse de eliminar el método del nombre de la acción, para que en la búsqueda no falle.















