1. ホーム
  2. java

[解決済み] Thymeleaf: Concatenation - 式としてパースできませんでした。

2023-02-03 14:35:43

質問

テンプレートで複数の値を連結しようとすると、問題が発生します。 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;
  }
}

どのように解決するのですか?

しかし、私が見たところ、あなたは構文で非常に単純なエラーを持っています。

<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ヶ月経った今、これはある意味無駄なことかもしれないけれども。