Groovy中使用GStringTemplateEngine实现模板多循环的技术问询
刚好我之前在项目里折腾过类似的需求,用Groovy的GStringTemplateEngine处理多层循环+HashMap变量替换其实没那么复杂,我给你一步步拆解具体怎么实现:
核心思路
其实GStringTemplateEngine本身就完美支持Groovy的表达式语法,所以你只需要把从配置文件生成的envVar HashMap直接作为模板的绑定变量,然后在模板里用Groovy的循环语法(比如each遍历)处理嵌套的列表结构就行,不需要额外做复杂的适配。
具体实现步骤(附完整代码)
我直接给你写一个可运行的示例,你可以直接套用到你的场景里:
1. 准备你的配置HashMap
首先是模拟从配置文件生成的envVar,注意要写成合法的Groovy Map格式:
def envVar = [ PROJECT: "MyCloudApp", env: [ [name: "DB_HOST", value: "localhost"], [name: "DB_PORT", value: "5432"], [name: "DEBUG_MODE", value: "true"] ], ports: [ [protocol: "TCP", port: 8080], [protocol: "UDP", port: 9000], [protocol: "HTTPS", port: 443] ] ]
2. 编写模板内容
模板里可以直接用<% %>包裹Groovy的循环逻辑,用${}取出变量值,不管是顶层的PROJECT还是嵌套的列表元素都能直接访问:
def templateContent = """ # Deployment Config for *${envVar.PROJECT}* --- ## Environment Variables <% envVar.env.each { envItem -> %> - **${envItem.name}**: ${envItem.value} <% } %> --- ## Exposed Ports <% envVar.ports.each { portItem -> %> - ${portItem.protocol} Port: ${portItem.port} <% } %> """
如果你是从文件加载模板,直接替换成new File("your-template-file.txt").text就行,写法完全一致。
3. 渲染模板并输出结果
最后用GStringTemplateEngine绑定变量并渲染:
@Grab('org.codehaus.groovy:groovy-templates:3.0.17') import groovy.text.GStringTemplateEngine // 初始化引擎 def engine = new GStringTemplateEngine() // 绑定envVar变量并生成模板实例 def renderedTemplate = engine.createTemplate(templateContent).make(envVar) // 输出渲染后的内容 println renderedTemplate.toString()
处理多层嵌套循环的扩展
如果你的配置里有更深层次的嵌套结构(比如每个环境变量还有子参数),直接在循环里再套一层遍历就行,比如:
修改envVar添加子参数:
def envVar = [ PROJECT: "MyCloudApp", env: [ [name: "DB_CONFIG", value: "postgres", subParams: [ [key: "max_connections", value: "100"], [key: "timeout", value: "30s"] ]], [name: "DEBUG_MODE", value: "true"] ], ports: [ [protocol: "TCP", port: 8080] ] ]
模板里嵌套循环:
def templateContent = """ # Deployment Config for *${envVar.PROJECT}* ## Environment Variables <% envVar.env.each { envItem -> %> - **${envItem.name}**: ${envItem.value} <% if (envItem.subParams) { %> Sub Parameters: <% envItem.subParams.each { sub -> %> - ${sub.key}: ${sub.value} <% } %> <% } %> <% } %> """
关键细节提醒
- 确保模板里的变量名和
envVar里的key完全一致,不然会找不到变量报错; <% %>里可以写任何合法的Groovy代码,比如条件判断、变量计算,不止局限于循环;- 如果模板内容特别长,建议放在单独的文件里维护,比写在代码里更清晰;
- 如果你用的是Groovy 3.x以上版本,记得引入
groovy-templates依赖(示例里的@Grab已经帮你做了,生产环境可以加到build.gradle里)。
内容的提问来源于stack exchange,提问作者Here_2_learn
相关产品推荐
相关产品推荐

