使用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
相关产品推荐
相关产品推荐

