我正在努力格式化Thymeleaf中的LocalDate,如下所示:
<div th:object="${objectWithDateField}">
<span th:text="*{#temporals.format(date)}"></span>
</div>
这将引发一个带有消息的NPE:对于方法格式,target为null,其中
target
引用format()
方法的参数。
所以我的问题是:我做错了什么,或者这是Thymeleaf的bug?
当我没有格式化日期并像下面这样渲染它时,它会正确显示日期。
<div th:object="${objectWithDateField}">
<span th:text="*{date}"></span>
</div>
我现在正在单元测试中运行这段代码,并添加了一个断言,在将对象传递给上下文之前向我确认日期绝对不为空(也通过在不调用format()
的情况下进行渲染来确认)。
我已经尝试了这个线程的解决方案,评论中的某人也有同样的问题,不幸的是没有答案。
我正在使用以下版本:
编辑:
为了澄清:我已经注册了我自己的TemplateEngine
bean并使用@主要
对其进行注释,以便能够像这样使用Thymeleafs默认方言:
@Bean
@Primary
public TemplateEngine myTemplateEngine() {
ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
templateResolver.setSuffix(".html");
templateResolver.setTemplateMode(TemplateMode.HTML);
TemplateEngine templateEngine = new TemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
return templateEngine;
}
thymeleaf-extas-java8time
存在于运行时类路径中,因为它是通过spring-boot-starter-thymeleaf
传递拉入的。
所以我找到了解决办法。
NPE异常消息中的target
实际上并不是指格式参数(也称为target
)。它指的是#临时
上下文对象。
所以为了解决这个问题,我从上面提到的thymeleaf-extas-java8time
库中添加了Java8TimeDialect
到我的TemplateEngine
bean,如下所示:
templateEngine.addDialect(new Java8TimeDialect());
从这里开始,一切都按预期进行。