es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Puedo encontrar un objeto dentro de una condición “if” con Thymeleaf?

Estoy intentando buscar una tabla con registros de usuarios. Por lo tanto, los usuarios administradores pueden eliminar, pero los usuarios estándar no. La relación user_role es de muchos a muchos, así que no sé cómo puedo acceder a estos datos en un bucle foreach con Thymeleaf.

Este es el código:

                <tbody>
                    <tr th:each="user : ${users}">              
                        <td th:text="*{id}" class="text-center id-field"></td>
                        <td th:text="*{name}" class="text-center"></td>
                        <td th:text="*{email}" class="text-center"></td>
                        <td th:if ="${currentUser.id != user.id and !user.getRoles().stream().filter(r -> r.name.equals('ADMIN')).isEmpty()}" class="text-center d-flex justify-content-center align-items-center">
                            <button type="button" class="btn btn-danger" onclick="deleteUser(this)">Eliminar</button>
                        </td>
                    </tr>             
                </tbody>

Como puedes ver, estoy intentando usar un filtro de transmisión para encontrar si el rol del usuario es estándar o administrador.
Me está arrojando este error:

 Expression [currentUser.id != user.id and !user.getRoles().stream().filter(r -> r.name.equals('ADMIN')).isEmpty()] @65: EL1042E: Problema al analizar el operando derecho

¿Es posible lo que estoy intentando?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando acceder a la relación de muchos a muchos entre usuarios y roles dentro de un bucle th:each de Thymeleaf.

    En lugar de utilizar un filtro de transmisión, puedes usar el objeto de utilidad #lists de Thymeleaf para verificar si el usuario tiene el rol de ADMIN. Aquí tienes un ejemplo de cómo puedes modificar tu código para lograr esto:

    <tbody>
        <tr th:each="user : ${users}">
            <td th:text="*{id}" class="text-center id-field"></td>
            <td th:text="*{name}" class="text-center"></td>
            <td th:text="*{email}" class="text-center"></td>
            <td th:if="${#lists.contains(user.roles.![name],'ADMIN') and currentUser.id != user.id}" class="text-center d-flex justify-content-center align-items-center">
                <button type="button" class="btn btn-danger" onclick="deleteUser(this)">Eliminar</button>
            </td>
        </tr>
    </tbody>
    

    En este código modificado, estamos usando la función de utilidad #lists.contains para verificar si el usuario tiene el rol de ADMIN. La expresión user.roles.![name] extraerá los nombres de todos los roles asociados con el usuario y devolverá una lista. La función #lists.contains luego verificará si la lista contiene el rol de ADMIN.

    Ten en cuenta que también hemos movido la verificación currentUser.id != user.id dentro de la condición th:if. Esto se debe a que solo queremos mostrar el botón de eliminar para los usuarios que no son el usuario actual.

    ¡Espero que esto te ayude!

Comments are closed.