WebWork, bug al encadenar una acción con método

Sábado, 11 de Febrero de 2006

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

Hacer un comentario

XHTML: Puedes utilizar las siguientes etiquetas:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>

Verification Image

Debes leer y teclear los caracteres entre 0..9 y A..F para enviar la respuesta.