提问者:小点点

#temals. format()抛出NullPointerException


我正在努力格式化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()的情况下进行渲染来确认)。

我已经尝试了这个线程的解决方案,评论中的某人也有同样的问题,不幸的是没有答案。

我正在使用以下版本:

  • Spring Boot Starter Thymeleaf:2.7.2
  • ognl: 3.2.1(我没有使用拼写)

编辑:

为了澄清:我已经注册了我自己的TemplateEnginebean并使用@主要对其进行注释,以便能够像这样使用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传递拉入的。


共1个答案

匿名用户

所以我找到了解决办法。

NPE异常消息中的target实际上并不是指格式参数(也称为target)。它指的是#临时上下文对象。

所以为了解决这个问题,我从上面提到的thymeleaf-extas-java8time库中添加了Java8TimeDialect到我的TemplateEnginebean,如下所示:

templateEngine.addDialect(new Java8TimeDialect());

从这里开始,一切都按预期进行。