Thymeleaf - 如何添加自定义工具?

Wil*_*Dev 9 java thymeleaf spring-boot

Thymeleaf有许多有用的工具,如#strings.capitalize(...)#lists.isEmpty(...).我正在尝试添加自定义但不知道如何注册.

制作了一个自定义的Util类:

public class LabelUtil {

    public String[] splitDoubleWord(String str) {
        return str.split("[A-Z]", 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我要像这样使用它:

<span th:each="item : ${#labels.splitDoubleWord(name)}" th:text="${item}"></span>
Run Code Online (Sandbox Code Playgroud)

当然,它不起作用,因为我没有注册Util并定义了#labelsvar.

那么,问题是如何以及在何处进行呢?

Yuk*_*ida 9

这个答案是针对thymeleaf 2.x.

如果您使用百日咳3.x或更高版本,请参阅其他答案.

public class MyDialect extends AbstractDialect implements IExpressionEnhancingDialect {

  public MyDialect() {
    super();
  }

  @Override
  public String getPrefix() {
    // @see org.thymeleaf.dialect.IDialect#getPrefix
    return "xxx";
  }

  @Override
  public boolean isLenient() {
    return false;
  }

  @Override
  public Map<String, Object> getAdditionalExpressionObjects(IProcessingContext ctx) {
    Map<String, Object> expressions = new HashMap<>();
    expressions.put("labels", new LabelUtil());
    return expressions;
  }
}
Run Code Online (Sandbox Code Playgroud)

并注册你的方言.

@Configuration
public class ThymeleafConfig {

  @Bean
  public MyDialect myDialect() {
    return new MyDialect();
  }
}
Run Code Online (Sandbox Code Playgroud)

thymeleaf-extras-java8time源代码是创建自定义百日咳表达式的好参考.


rya*_*anp 6

Thymeleaf 3 中用于注册自定义表达式对象的 API 已更改,例如:

public class MyDialect extends AbstractDialect implements IExpressionObjectDialect {

    MyDialect() {
        super("My Dialect");
    }

    @Override
    public IExpressionObjectFactory getExpressionObjectFactory() {
        return new IExpressionObjectFactory() {

            @Override
            public Set<String> getAllExpressionObjectNames() {
                return Collections.singleton("myutil");
            }

            @Override
            public Object buildObject(IExpressionContext context,
                    String expressionObjectName) {
                return new MyUtil();
            }

            @Override
            public boolean isCacheable(String expressionObjectName) {
                return true;
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)