Thymeleaf: Verkettung - Konnte nicht als Ausdruck analysiert werden

82

Ich habe ein Problem beim Versuch, mehrere Werte in meiner Vorlage zu verknüpfen. Laut Thymeleaf hier sollte ich einfach in der Lage sein, sie zusammen zu machen ...

4.6 KONKATENIERENDE TEXTE

Texte, unabhängig davon, ob es sich um Literale oder das Ergebnis der Auswertung von Variablen- oder Nachrichtenausdrücken handelt, können mit dem Operator + einfach verkettet werden:

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

Hier ist ein Beispiel für das, was ich gefunden habe:

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

Dies jedoch nicht:

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

Logischerweise sollte dies funktionieren, aber es ist nicht so, was mache ich falsch?


Maven:

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

So habe ich meine TemplateEngine und TemplateResolver eingerichtet:

<!-- 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
quelle
Ich habe den gleichen Fehler aufgetreten !!!!!!!!!! aber ich benutze Thymeleaf und Scala
Der einzige Weg, wie ich es geschafft habe, ist die Vorverarbeitung. <p th:text="${'__${bean.property1}__' + '::' + '__${bean.property2}__'}">default text</p>
NeilA
Dieses Beispiel funktioniert für mich. Welche Version von Thymeleaf verwenden Sie? Verwenden Sie zusätzliche Dialekte?
Hubbardr

Antworten:

198

Aber soweit ich sehe, haben Sie einen recht einfachen Syntaxfehler

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

Die richtige Syntax würde so aussehen

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

Tatsächlich ist die Syntax th:text="'static part' + ${bean.field}"gleich th:text="${'static part' + bean.field}".

Versuch es. Auch wenn dies jetzt nach 6 Monaten wahrscheinlich irgendwie nutzlos ist.

Elijah Saounkine
quelle
Danke, hilfreich für mich.
Asifaftab87
23
Nach 6 Monaten nutzlos?, 6 Jahre später ist es immer noch nützlich
AguThadeus
32

Sie können viele Arten von Ausdrücken zusammenfassen, indem Sie Ihren einfachen / komplexen Ausdruck zwischen ||Zeichen umschließen :

<p th:text="|${bean.field} ! ${bean.field}|">Static content</p>
Fernando Aspiazu
quelle
Ich benutze Thymeleaf Version: 2.1.1.RELEASE (es sollte die letzte Version sein)
Fernando Aspiazu
Funktioniert hervorragend in der Version2.1.5
Thiago Pereira
1
Was ist, wenn Text | enthält? Zum Beispiel. "|${fullName} Stories \| Twiza|"Ich bekomme Konnte nicht als Ausdruck analysieren.
Piyush
Wie es hier gemacht wird, hat es nicht funktioniert. th:class="'hotel listing col organic urgencyMsg available organic h-' + ${record.hotelInfo.hotelId} + '-organic'">3.0.2
Kannst
1
Für die Verwendung der vertikalen Leiste (|) im Text:<p>[[${fullName}]] Stories | Twiza </p>
Ranjan
3

Beachten Sie, dass mit | char, Sie können eine Warnung mit Ihrer IDE erhalten, zum Beispiel bekomme ich eine Warnung mit der letzten Version von IntelliJ. Die beste Lösung ist also, diese Syntax zu verwenden:

th:text="${'static_content - ' + you_variable}"
Walterwhites
quelle
1

Wir können uns so verhalten:


<h5 th:text ="${currentItem.first_name}+ ' ' + ${currentItem.last_name}"></h5>
Abhishek Sengupta
quelle