@educasitas

viernes, 28 de enero de 2011

DisplayTag: Columnas Ordenadas con RowSetDynaClass

Esto tenía que contarlo.

Hoy con las vueltas que da el mundo me he encontrado con un problema con la librería displaytag [http://www.displaytag.org] que utilizo habitualmente en mis webapps en Java.

Una de las posibilidades que ofrece la librería es presentar de una manera sencilla los resultados de una consulta SQL devolviendo dinámicamente las columnas que correspondan aunque al utilizarlo me he encontrado con un problema el orden de las columnas era aleatorio y no se regía por el orden establecido en la consulta SQL.

Investigando como funciona displaytag en ese caso al final el problema estaba en que internamente llamaba a la clase BeanUtilsBean del paquete commons-beanutils.jar y esta utilizaba HashMap (que no mantienen el orden de las columnas) para almacenar las columnas.

Por tanto, la solución ha consistido en obtener el código fuente de BeanUtilsBean y modificar el tipo de Map usado, es decir, eliminar el uso de HashMap (que no conserva el orden) y utilizar LinkedHashMap (que si que lo conserva). Sólo con añadir al proyecto el código fuente de la clase BeanUtilsBean (conservando la estructura de paquetes del jar) y hacer una pequeña modificación en el método describe(Object bean) ha sido suficiente.

public Map describe(Object bean)
throws IllegalAccessException, InvocationTargetException,
NoSuchMethodException {

...

Map description = new LinkedHashMap();
if (bean instanceof DynaBean) {
DynaProperty descriptors[] =
((DynaBean) bean).getDynaClass().getDynaProperties();
...
}

Y todo esto porque es así... una por lo maravillo que es el uso de interfaces (cambiar de HashMap a LinkedHashMap es gratis) y dos por cómo funciona el ClassLoader de Java (lo último que se carga son tus ficheros .java).

2 comentarios:

  1. Yo lo he solucionado de otra forma sin necesidad que tener que decompilar clases ajenas.

    Mi solución:

    "
    decorator="<%=decorator%>">
    <%
    for (int i = 0; i < columnNames.size(); i++) {
    %>

    <%
    }
    %>


    Espero que sirva de ayuda a alguien...Un saludo.

    ResponderEliminar
    Respuestas
    1. Saludos no entiendo bien como solucionar este problema yo lo tengo en mi pagina JSP llamandolo asi display:table name="requestScope.results2.rows" y en el servlet le cargo en request.setAttribute() pero me sale totalmente desordenadas las columnas les agradeceria si me pueden ayudar

      Eliminar