Thymeleaf有许多有用的工具,例如#strings.capitalize(...)
或#lists.isEmpty(...)
。我试图添加自定义但不知道如何注册。
制作了自定义的Util类:
public class LabelUtil {
public String[] splitDoubleWord(String str) {
return str.split("[A-Z]", 1);
}
}
现在我要像这样使用它:
<span th:each="item : ${#labels.splitDoubleWord(name)}" th:text="${item}"></span>
当然,它没有工作,因为我还没有注册Util并定义了#labels
var。
那么,问题是如何以及在何处进行?
答案 0 :(得分:9)
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;
}
}
并注册您的方言。
@Configuration
public class ThymeleafConfig {
@Bean
public MyDialect myDialect() {
return new MyDialect();
}
}
thymeleaf-extras-java8time源代码是创建自定义百日咳表达式的好参考。
答案 1 :(得分:3)
注册自定义表达式对象的API有changed in Thymeleaf 3,例如:
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;
}
};
}
}