Thymeleaf: konkatenacja - nie można przeanalizować jako wyrażenia

83

Mam problem, gdy próbuję połączyć wiele wartości w moim szablonie. Według Thymeleaf tutaj powinienem po prostu móc + je razem ...

4.6 TEKSTY ZŁĄCZAJĄCE

Teksty, niezależnie od tego, czy są to literały, czy też wynik oceny wyrażeń zmiennych lub komunikatów, można łatwo łączyć za pomocą operatora +:

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

Oto przykład tego, co znalazłem, działa:

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

To jednak nie:

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

Logicznie rzecz biorąc, to powinno działać, ale nie. Co robię źle?


Maven:

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

Oto jak skonfigurowałem mój TemplateEngine i 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>

Thymeleaf Przykładowa Usługa:

@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
źródło
Wystąpił ten sam błąd !!!!!!!!!! ale używam thymeleaf i scala
Jedynym sposobem, w jaki udało mi się to zrobić, jest użycie wstępnego przetwarzania. <p th:text="${'__${bean.property1}__' + '::' + '__${bean.property2}__'}">default text</p>
NeilA
Ten przykład działa dla mnie. Jakiej wersji thymeleaf używasz? Czy używasz dodatkowych dialektów?
hubbardr

Odpowiedzi:

202

Ale z tego, co widzę, masz dość prosty błąd w składni

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

wyglądałaby poprawna składnia

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

W rzeczywistości składnia th:text="'static part' + ${bean.field}"jest równa th:text="${'static part' + bean.field}".

Wypróbuj to. Chociaż jest to prawdopodobnie trochę bezużyteczne teraz po 6 miesiącach.

Elijah Saounkine
źródło
Dzięki, pomocne dla mnie.
asifaftab87
23
Bezużyteczny po 6 miesiącach ?, Nadal jest przydatny 6 lat później
AguThadeus
32

Możesz łączyć wiele rodzajów wyrażeń, otaczając swoje proste / złożone wyrażenie między ||znakami:

<p th:text="|${bean.field} ! ${bean.field}|">Static content</p>
Fernando Aspiazu
źródło
Używam wersji Thymeleaf: 2.1.1.RELEASE (powinna to być ostatnia wersja)
Fernando Aspiazu
Działa świetnie na wersji2.1.5
Thiago Pereira
1
Co jeśli tekst zawiera |? Na przykład. "|${fullName} Stories \| Twiza|"Otrzymuję Nie można przeanalizować jako wyrażenia.
Piyush
jak to zrobić tutaj to nie zadziałało, możesz przekonwertować to na swoją składnię ... th:class="'hotel listing col organic urgencyMsg available organic h-' + ${record.hotelInfo.hotelId} + '-organic'"> używam3.0.2
shareef
1
Za użycie pionowej kreski (|) w tekście:<p>[[${fullName}]] Stories | Twiza </p>
ranjan
4

Zauważ, że z | char, możesz otrzymać ostrzeżenie za pomocą swojego IDE, na przykład otrzymuję ostrzeżenie z ostatnią wersją IntelliJ, więc najlepszym rozwiązaniem jest użycie tej składni:

th:text="${'static_content - ' + you_variable}"
Walterwhites
źródło
1

Możemy podsumować w ten sposób:


<h5 th:text ="${currentItem.first_name}+ ' ' + ${currentItem.last_name}"></h5>
Abhishek Sengupta
źródło