Thymeleaf: Concatenation - не удалось проанализировать как выражение

83

У меня проблема при попытке объединить несколько значений в моем шаблоне. Согласно Thymeleaf здесь я просто смогу + их вместе ...

4.6 СОЕДИНЕНИЕ ТЕКСТОВ

Тексты, независимо от того, являются ли они литералами или результатом вычисления переменных или выражений сообщений, можно легко объединить с помощью оператора +:

th:text="'The name of the user is ' + ${user.name}"

Вот пример того, что я нашел, работает:

<p th:text="${bean.field} + '!'">Static content</p>

Однако это не так:

<p th:text="${bean.field} + '!' + ${bean.field}">Static content</p>

По логике, это должно работать, но это не так, что я делаю не так?


Maven:

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring3</artifactId>
    <version>2.0.16</version>
    <scope>compile</scope>
</dependency>

Вот как я настроил свои TemplateEngine и TemplateResolver:

<!-- Spring config -->
<bean id="templateResolver" class="org.thymeleaf.templateresolver.ClassLoaderTemplateResolver">
    <property name="suffix" value=".html"/>
    <property name="templateMode" value="HTML5"/>
    <property name="characterEncoding" value="UTF-8"/>
    <property name="order" value="1"/>
</bean>
<bean id="templateEngine" class="org.thymeleaf.spring3.SpringTemplateEngine">
    <property name="templateResolver" ref="fileTemplateResolver"/>
    <property name="templateResolvers">
        <list>
            <ref bean="templateResolver"/>
        </list>
    </property>

ThymeleafTemplatingService:

@Autowired private TemplateEngine templateEngine;
.....
String responseText = this.templateEngine.process(templateBean.getTemplateName(), templateBean.getContext());

AbstractTemplate.java:

public abstract class AbstractTemplate {
  private final String templateName;
  public AbstractTemplate(String templateName){
    this.templateName=templateName;
  }
  public String getTemplateName() {
    return templateName;
  }
  protected abstract HashMap<String, ?> getVariables();
  public Context getContext(){
    Context context = new Context();
    for(Entry<String, ?> entry : getVariables().entrySet()){
      context.setVariable(entry.getKey(), entry.getValue());
    }
    return context;
  }
}
NeilA
источник
У меня такая же ошибка !!!!!!!!!! но я использую тимелеаф и scala
Единственный способ заставить его работать - это использовать предварительную обработку. <p th:text="${'__${bean.property1}__' + '::' + '__${bean.property2}__'}">default text</p>
NeilA
Этот пример мне подходит. Какую версию тимелиста вы используете? Вы используете какие-то дополнительные диалекты?
hubbardr

Ответы:

202

Но из того, что я вижу, у вас довольно простая синтаксическая ошибка

<p th:text="${bean.field} + '!' + ${bean.field}">Static content</p>

правильный синтаксис будет выглядеть как

<p th:text="${bean.field + '!' + bean.field}">Static content</p>

По сути, синтаксис th:text="'static part' + ${bean.field}"равен th:text="${'static part' + bean.field}".

Попробуйте сами. Хотя сейчас, вероятно, через 6 месяцев это бесполезно.

Элайджа Саункин
источник
Спасибо, полезно для меня.
asifaftab87
23
Бесполезен через 6 месяцев? Он все еще полезен 6 лет спустя
AguThadeus
32

Вы можете объединить множество видов выражений, заключив простое / сложное выражение между ||символами:

<p th:text="|${bean.field} ! ${bean.field}|">Static content</p>
Фернандо Аспиазу
источник
Я использую версию Thymeleaf: 2.1.1.RELEASE (это должна быть последняя версия)
Фернандо Аспиазу
Отлично работает над версией2.1.5
Тьяго Перейра
1
Что, если текст содержит |? Например. "|${fullName} Stories \| Twiza|"Я получаю Не могу разобрать как выражение.
Piyush
как это сделать здесь это не сработало, вы можете преобразовать это в свой синтаксис ... th:class="'hotel listing col organic urgencyMsg available organic h-' + ${record.hotelInfo.hotelId} + '-organic'"> я использую3.0.2
shareef
1
За использование вертикальной черты (|) в тексте:<p>[[${fullName}]] Stories | Twiza </p>
ranjan
4

Обратите внимание, что с | char, вы можете получить предупреждение с помощью своей IDE, например, я получаю предупреждение с последней версией IntelliJ, поэтому лучшее решение - использовать этот синтаксис:

th:text="${'static_content - ' + you_variable}"
Walterwhites
источник
1

Мы можем объединить вот так:


<h5 th:text ="${currentItem.first_name}+ ' ' + ${currentItem.last_name}"></h5>
Абхишек Сенгупта
источник