java - tutorial - thymeleaf vs jsp
¿Cómo pueden procesarse los mensajes localizados en Thymeleaf utilizando SpEL? (3)
Lo siguiente funcionó para mí
<body th:with="message=#{retrievable.key}">
<h1 th:text="${#strings.capitalize(message)}">Text to be replaced</h1>
</body>
Soy un principiante con ThymeLeaf y no he usado demasiado SpEL a excepción de @PreAuthorize
anotaciones @PreAuthorize
, así que sea tan amable de ayudarme.
Estoy usando ThymeLeaf (versión 2.1.2) junto con Spring (4.0.2.RELEASE) y el paquete thymeleaf-spring4
que (hasta donde yo lo entiendo) reemplaza el scripting OGNL predeterminado con SpEL .
Lo que quiero lograr es simplemente que una cadena localizada se capitalice a través de la función #strings.capitalize
. Esto es lo que intenté hasta ahora:
<h1 th:text="#{retrievable.key}">Text to be replaced</h1>
Funciona perfectamente y da el resultado esperado.
Ahora cuando probé esto:
<h1 th:text="${#strings.capitalize(#{retrievable.key})}">Text to be replaced</h1>
Obtuve la siguiente excepción (causa raíz, resto omitido para mayor claridad):
org.springframework.expression.spel.SpelParseException:
EL1043E:(pos 21): Unexpected token. Expected ''identifier'' but was ''lcurly({)''
Está bien. Solo por diversión, omití las llaves y obtuve lo que esperaba: el <h1>
estaba vacío.
Así que ahora pensé que podría ser necesario preprocesar la recuperación del mensaje para retrievable.key
para que ya se evalúe cuando se evalúa #strings.capitalize
. Aunque esto me pareció contradictorio e ilógico, ya que esto rompería todas las reglas de programación, probé ese enfoque. Tampoco funcionó: usando
${#strings.capitalize(__#retrievable.key__)}
Conducir a
org.thymeleaf.exceptions.TemplateProcessingException:
Could not parse as expression: "#retrievable.key"
y usando
${#strings.capitalize(__#{retrievable.key}__)}
llevado a (lo adivinaste) <h1></h1>
.
Sé que el problema real se puede resolver con CSS o JavaScript, pero no se trata necesariamente de mayúsculas o de mayúsculas, sino del procesamiento de cadenas localizadas, y este es un ejemplo.
Entonces, ¿qué es lo que echo de menos aquí?
Solución proporcionada por Thymeleaf Forum
Zemi del Foro ThymeLeaf proporcionó la siguiente y elegante solución :
<h1 th:text="${#strings.capitalize(''__#{retrievable.key}__'')}">Text to be replaced</h1>
Por favor, tenga en cuenta las comillas simples. El preprocesamiento parece significar realmente el preprocesamiento en Thymeleaf.
Sin embargo, acepté la primera respuesta de trabajo.
Como escribiste, parece que las expresiones preprocesadas ala
__${...}__
no trabaje con el hashtag
Lo que puede hacer en su lugar es usar el bean messageSource dentro de su expresión ya que esto se puede resolver en una expresión "normal" como cualquier otra cosa.
<div th:text="${beans.messageSource.getMessage(messageVariable)}"></div>
¿Por qué capitalizarías una cadena localizada? Si estuviera realmente localizado en diferentes idiomas, es posible que no obtengas los resultados que deseas si haces una ToUpper en ellos. El mejor enfoque es localizar las cadenas en el caso que desee para su visualización.