👌

Spring BootでThymeleafのDialectを追加する方法

2024/08/09に公開

環境

Spring Boot 2.0

デフォルトで使えるDialect

  • Java8TimeDialect

spring-boot-starter-thymeleafの依存性として入っていて、かつAuto Configurationクラス内で追加されているので、何もしないでも使うことができます。

依存性を追加するだけでOKなDialect

  • SpringSecurityDialect
  • LayoutDialect
  • DataAttributeDialect

上記の3つはAuto Configuration対象になっているため、依存性を追加するだけで使うことが出来ます。

ここらへんを読んでみてください。

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java#L297

その他のDialect(自作のDialectなど)

上記以外のDialectについては、適当にJava Configクラスを作成してDialectをBean定義すればOKです。

@Configuration
public class ThymeleafDialectConfig {

    @Bean
    public FooDialect fooDialect() {
        return new FooDialect();
    }

    @Bean
    public BarDialect barDialect() {
        return new BarDialect();
    }
}

Bean定義すれば、Auto Configurationクラスによって使われます。

https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/thymeleaf/ThymeleafAutoConfiguration.java#L143

やってはいけなくはないけど・・・

SpringTemplateEngine を自分でBean定義してもいいのですが、Auto Configurationクラスで定義している SpringTemplateEngine のBeanが無効化されてしまいますので、なるべくやらないようにしましょう。

これはなるべくしない
@Configuration
public class ThymeleafDialectConfig {
    
    @Bean
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        ...
        engine.addDialect(new SpringSecurityDialect());
        engine.addDialect(new LayoutDialect());
        engine.addDialect(new DataAttributeDialect());
        engine.addDialect(new FooDialect());
        engine.addDialect(new BarDialect());
        return engine;
    }
}

Discussion