PlayFramework Twirl中导入文件部分内容被忽略的问题求助
解决Twirl模板拆分后导入文件内容被忽略的问题
嘿,我之前在拆分Twirl模板生成Swagger内容时也踩过类似的坑,结合你给出的代码来看,问题主要出在模板参数类型错误和Twirl调用语法不规范上,咱们一步步来修复:
问题根源分析
你现在的主模板bigFile.scala.txt把otherFile当成String类型传入,但Twirl模板是编译成Scala类的,你需要传入的是子模板的实例,而不是字符串。另外,模板里多余的嵌套大括号和错误的调用方式,导致Twirl解析时直接忽略了子模板的内容。
具体修复步骤
1. 修正子模板otherFile.scala.txt的语法
先把多余的嵌套大括号和末尾逗号去掉,保证Swagger/JSON结构合法,同时符合Twirl的语法要求:
{ "a": "b" }
2. 修正主模板bigFile.scala.txt的参数和调用方式
把参数类型改成子模板的实际类型,并且用函数调用的方式渲染子模板(哪怕是空参数也要加()):
@(otherFile: com.telefonica.baikal.views.txt.otherFile) { "foo": "bar", @otherFile(), "one": "two" }
注意:如果主模板和子模板在同一个包下(比如都是
com.telefonica.baikal.views.txt),参数类型可以直接写otherFile不用全限定名。
3. 在Scala代码中正确调用主模板
调用时要传入子模板的实例(通过otherFile()创建):
import com.telefonica.baikal.views.txt._ // 渲染主模板,传入子模板实例 val swaggerContent = bigFile(otherFile()).body
额外注意事项
- Twirl对语法要求很严格,多余的大括号、逗号都会导致渲染异常,一定要保证生成的JSON结构合法;
- 拆分模板时,每个子模板都要能独立编译,避免出现语法错误;
- 如果子模板需要动态参数,只要在子模板里定义参数,主模板调用时传入对应值即可,比如
@otherFile(someParam)。
内容的提问来源于stack exchange,提问作者Guillermo Pastor Díez
相关产品推荐
相关产品推荐

