spring 从百里香叶3.0迁移至3.1

plupiseo  于 2023-01-12  发布在  Spring
关注(0)|答案(1)|浏览(201)

我在我的Sping Boot 应用程序中有一个极简主义的Thymeleaf配置,它只是用来将HTML渲染成PDF文件。
我正在升级到春 Boot 3,需要将thymeleaf从3.0升级到3.1
这是我在升级到Sping Boot 3之前的旧代码,主要区别是WebContext的构造。在thymeleaf 3.0中,我是基于servlet请求/响应构建它的,而在thymeleaf 3.1中,我们是从WebExchange对象构建它的

Thymeleaf 3.0的控制器

override fun previewDataController(
    request: HttpServletRequest,
    response: HttpServletResponse,
    objId: UUID,
): ResponseEntity<ByteArray> {
    val context = WebContext(request, response, request.servletContext)
    val pdfData = someService.previewData(context, objId)
    ...
}

升级到百里香3.1

override fun previewDataController(
    webExchange: IWebExchange,
    objId: UUID,
): ResponseEntity<ByteArray> {
    val context = WebContext(webExchange, webExchange.locale)
    val pdfData = someService.previewData(context, objId)
    ...
}

下面是失败的代码

@Autowired
val templateEngine: TemplateEngine

...

fun someMethod(context: WebContext) {
    val htmlString = templateEngine.process("resources/template", context)
    ...
}

在上下文中有对象object,并且在调试中可以看到此属性不为空
以下是模板:

<body>
    <p>Name <span th:text="${object.name}">#</span></p>
</body>

但是我的单元测试失败了,声明模板中的object为null。

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'name' cannot be found on null

问题:

1.这是构建IWebExchange对象的正确方法吗?它会被Spring绑定吗?
1.我是否遗漏了新3.1版本的任何配置?
1.会不会是测试上下文配置的问题?
谢谢!

q5lcpyga

q5lcpyga1#

Thymeleaf的情况发生了很大的变化,主要是因为它提供了JavaEEJakartaEE支持,所以需要抽象一些东西,现在简单地创建一个WebExchange就更复杂了。
你应该能够做什么(你可能可以转换的Java代码)。

public class ThymeleafHelper {

  public static WebContext createContext(HttpServletRequest req, HttpServletResponse res) {
    var application = JakartaServletWebApplication.buildApplication(req.getServletContext());
    var exchange application.buildExchange(req, res);
    return new WebContext(exchange);
  }
}

您应该能够调用该函数(并将其转换为Kotlin)以创建所需的WebContext

相关问题