Freemaker中是否有语法可引入已定义字段至新配置条目?
在Freemarker中复用processor_tool字段到processor_all
问题场景
现有FTL文件内容如下:
{ <#-- processor_tool is an existing field --> "processor_tool" : { <#if Trigger?has_content> "vendor_trigger": "${VendorTrigger}" </#if> ... }, <#-- processor_all is new entry to the ftl file --> "processor_all" : { "timeout" : "${timeout}" <#-- add all fields from "processor_tool" declared above --> } }
需要为新增的processor_all条目添加新字段的同时,复用processor_tool中的所有字段,避免复制粘贴导致的重复代码问题。
解决方案:使用Freemarker宏(Macro)实现复用
通过定义宏封装processor_tool的字段逻辑,让processor_tool和processor_all都调用这个宏,实现代码复用,符合DRY原则。
步骤1:定义封装字段的宏
在FTL文件合适位置(比如开头)定义宏,把processor_tool内的字段逻辑放入其中:
<#macro processorToolFields> <#if Trigger?has_content> "vendor_trigger": "${VendorTrigger}" </#if> ... <!-- 其他processor_tool的字段 --> </#macro>
步骤2:在processor_tool中调用宏
修改原processor_tool的代码,用宏调用替代原字段声明:
"processor_tool" : { <@processorToolFields /> },
步骤3:在processor_all中调用宏并添加新字段
在processor_all中先添加自定义新字段,再调用宏引入processor_tool的所有字段:
"processor_all" : { "timeout" : "${timeout}", <@processorToolFields /> }
补充方案:使用include引入片段文件
如果字段逻辑复杂,也可以把processor_tool的字段内容单独放到一个FTL片段文件(比如processor_tool_fields.ftl)中,然后在两处通过<#include>引入:
<!-- processor_tool中引入 --> "processor_tool" : { <#include "processor_tool_fields.ftl"> }, <!-- processor_all中引入 --> "processor_all" : { "timeout" : "${timeout}", <#include "processor_tool_fields.ftl"> }
两种方案都能实现代码复用,后续修改processor_tool的字段时,只需修改宏或片段文件的内容,两处会自动同步,避免重复修改。
内容的提问来源于stack exchange,提问作者adarsh
相关产品推荐
相关产品推荐

