从VM文件的formRowModels中获取组织名称报错问题咨询
解决Velocity模板中使用Stream/Lambda过滤数据报错的问题
问题原因
Velocity模板引擎默认不支持Java 8的Stream API和Lambda表达式语法,你写的${ctx.formRowModels.stream().filter(row -> row.getKey().contains("Organization"))}会因为语法解析失败报错。
可行解决方案
后端提前处理数据(推荐)
在后端Java代码中完成过滤逻辑,将结果存入上下文后再传递给Velocity模板:// 后端Controller/Service代码示例 List<FormRowModel> orgRows = ctx.getFormRowModels().stream() .filter(row -> row.getKey().contains("Organization")) .collect(Collectors.toList()); ctx.put("organizationRows", orgRows);模板中直接使用处理好的数据:
${organizationRows}模板内用Velocity原生循环过滤
放弃Stream/Lambda,改用Velocity的#foreach和#if手动实现过滤:#foreach($row in $ctx.formRowModels) #if($row.getKey().contains("Organization")) # 这里可以输出或处理组织名称,比如取对应值 ${row.getValue()} #end #end自定义Velocity工具类
封装过滤逻辑成工具方法,注册到Velocity上下文后在模板调用:- 编写工具类:
public class FormRowUtils { public static List<FormRowModel> filterByKeyKeyword(List<FormRowModel> models, String keyword) { return models.stream() .filter(row -> row.getKey().contains(keyword)) .collect(Collectors.toList()); } }- 配置Velocity将工具类注入上下文(具体配置方式依项目框架而定)
- 模板中调用:
${formRowUtils.filterByKeyKeyword($ctx.formRowModels, "Organization")}
内容的提问来源于stack exchange,提问作者samplist_mouse
相关产品推荐
相关产品推荐

