Quarkus Qute 3.16.x调用Java方法参数值异常求助
Qute 3.16.1循环中调用Java方法时参数异常问题
问题现象
升级Quarkus Qute从3.15.2到3.16.1后,在模板的嵌套循环中出现异常:
- 直接输出
{project.name}能正确显示当前循环项的项目名称 - 调用Java方法
schedules.forProjectAndName(project, name, project_index)时,方法接收到的project参数始终是外层循环的第一个项目对象,与模板渲染的当前项目不一致
模板代码片段:
{#for project in schedules.projects} {#for name in schedules.names} <script>console.log("Name: Project.name = [{project.name}]");</script> {#let schedule = schedules.forProjectAndName(project, name, project_index)} ........ {/for} {/for}
Java方法代码片段:
public PipelineSchedule forProjectAndName(final Project project, final String scheduleName, final int indexCount) { log.info("Name: Project.Name = [{}], ScheduleName = [{}], indexCount = [{}]", project.name(), scheduleName, indexCount); // 方法逻辑 }
原因分析
这是Quarkus Qute 3.16.x版本的已知bug:模板渲染时的循环变量绑定优化逻辑出现问题,内层循环调用Java方法时,Qute没有正确捕获外层循环的当前project变量实例,而是错误复用了第一次循环时的变量引用,导致后续方法调用始终传递第一个项目对象。
解决办法
临时修复方案
- 局部变量中转:在外层循环内部将当前
project赋值给局部临时变量,通过强制触发变量重新绑定,避免Qute复用旧引用:
{#for project in schedules.projects} {#let currentProject = project} {#for name in schedules.names} <script>console.log("Name: Project.name = [{project.name}]");</script> {#let schedule = schedules.forProjectAndName(currentProject, name, project_index)} ........ {/for} {/for}
- 传递唯一标识替代对象:修改Java方法参数,改用项目唯一标识(如ID)替代
Project对象传递,在方法内部通过标识查询对应实例:
// 修改后的Java方法 public PipelineSchedule forProjectAndName(final String projectId, final String scheduleName, final int indexCount) { Project project = projectRepository.findById(projectId); log.info("Name: Project.Name = [{}], ScheduleName = [{}], indexCount = [{}]", project.name(), scheduleName, indexCount); // 方法逻辑 }
模板对应修改:
{#let schedule = schedules.forProjectAndName(project.id, name, project_index)}
- 版本回退:暂时降级到Qute 3.15.2版本,等待Quarkus官方修复该bug后再升级。
长期解决方案
关注Quarkus官方更新日志,确认该bug是否已被修复;若未修复,可提交包含复现案例的issue到Quarkus开发团队,推动问题解决。
内容的提问来源于stack exchange,提问作者Madere
相关产品推荐
相关产品推荐

