Velocity宏中等值判断功能失效问题排查
Velocity宏代码问题分析与修复
问题描述
你编写的Velocity宏在调用后,最后的#if($sqlDatabase == "sql")判断始终无法通过,后续代码无法执行。
原代码
#macro( ccase $profiles,$databasename ) #foreach( $profile in $profiles.split(',')) #if( $profile == $databasename) #set($result = $profile) #$result #end #end #end #set($databaseName="sql") #set($sqlDatabase = "#ccase( $profile-db,$databaseName )" ) #if($sqlDatabase == "sql") <!-- Fails Here This is not getting passed at all--> Below code notexecuted #end
问题根源
- 错误的变量输出方式:宏中的
#$result是错误写法,Velocity中输出变量直接使用$result即可,#$result会被当作指令解析,导致无法正确输出内容。 - 无效的变量名:调用宏时传入的
$profile-db是非法变量名,Velocity变量名不能包含减号,会被解析为$profile减去db,导致宏接收的参数错误,无法正确执行split和匹配逻辑。 - 宏返回逻辑缺陷:当前宏仅在匹配时尝试输出内容,但没有正确将结果返回给调用的变量
$sqlDatabase,导致变量值为空或不符合预期。
修复后的代码
#macro(ccase $profiles, $databasename) #set($result = "") #foreach($profile in $profiles.split(',')) #if($profile.trim() == $databasename.trim()) #set($result = $profile) #break ## 匹配到后立即退出循环,提升效率 #end #endforeach $result ## 输出结果,让调用方捕获返回值 #end #set($databaseName = "sql") #set($profileDb = "oracle,sql,mysql") ## 修正变量名,符合Velocity命名规则 #set($sqlDatabase = "#ccase($profileDb, $databaseName)") #if($sqlDatabase == "sql") 现在这部分代码可以正常执行了 #end
修复说明
- 将
#$result改为$result,确保变量正确输出,避免指令解析错误。 - 把
$profile-db改为合法变量名$profileDb,保证宏能接收正确的参数。 - 宏内部初始化
$result为空字符串,匹配成功后设置值并退出循环,最后输出$result,确保调用宏时能获取到正确的返回值。 - 增加
trim()处理,避免字符串前后空格导致匹配失败。
内容的提问来源于stack exchange,提问作者bharathi
相关产品推荐
相关产品推荐

