You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Kotlin数据类实现Quarkus Qute类型安全模板遇阻求助

Qute类型安全模板(Kotlin)实现问题解答

结论先行:你用Kotlin数据类直接实现TemplateInstance并配合@CheckedTemplate的方式不可行,报错的核心原因是你手动实现了TemplateInstance接口,但未重写其核心方法,导致框架调用时触发默认的UnsupportedOperationException。

问题根源

Quarkus Qute的@CheckedTemplate注解的作用是为标注的抽象类/接口自动生成实现TemplateInstance的代理类,而非让用户手动实现该接口。你直接让数据类继承TemplateInstance,相当于绕过了框架的自动生成逻辑,而TemplateInstance接口中的getTemplate()等核心方法默认实现就是抛出异常,这就是栈跟踪中报错的直接原因。

正确实现方式

方式1:使用@CheckedTemplate标注抽象接口(推荐,符合类型安全模板设计)

不要用数据类实现TemplateInstance,而是将@CheckedTemplate标注在抽象接口上,让框架自动生成实现类:

@GET 
@Path("/list") 
@Produces(MediaType.TEXT_HTML)
fun list(@QueryParam("pageIndex") pageIndex: Int = 0): TemplateInstance {
    val paginatedData = Paginated(
        currentPage = 0,
        pageCount = 1,
        items = listOf("example")
    )
    return ExampleListTemplate.instance(paginatedData)
}

@CheckedTemplate(basePath = "example")
interface ExampleListTemplate {
    fun instance(data: Paginated<String>): TemplateInstance
}
  • 框架会自动为ExampleListTemplate接口生成代理,内部正确实现TemplateInstance的所有方法
  • 模板文件需放在src/main/resources/templates/example/目录下,文件名与方法名对应(比如instance对应instance.html,也可通过@Template注解指定自定义文件名)

方式2:直接注入Template并手动创建实例

如果偏好手动控制,可以直接注入目标模板,通过data()方法传递参数:

@Inject
@Named("example/exampleList") // 对应模板路径:templates/example/exampleList.html
lateinit var exampleListTemplate: Template

@GET 
@Path("/list") 
@Produces(MediaType.TEXT_HTML)
fun list(@QueryParam("pageIndex") pageIndex: Int = 0): TemplateInstance {
    val paginatedData = Paginated(
        currentPage = 0,
        pageCount = 1,
        items = listOf("example")
    )
    return exampleListTemplate.data("data", paginatedData)
}

内容的提问来源于stack exchange,提问作者mthmulders

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:40:11