5.8 Beetl常用错误解决

5.8.1 模板加载错误

MVC框架如果加载不到模板,请先确认是否指定了正确的ResourceLoader。对于Spring Boot,使用的是ClassPathResourceLoaer,加载位于templates目录下的模板

对于其他WEB应用,内部使用的是FileResourceLoader,模板根目录位于web根目录。

Spring常见模板加载问题有可能如下原因

  • spring 配置使用了前缀,错误:
  1. <property name="prefix" value="/WEB-INF/view/"></property>

可以指定模板根目录

  1. <bean name="beetlConfig" class="org.beetl.ext.spring.BeetlGroupUtilConfiguration" init-method="init">
  2. <property name="root" value="/WEB-INF/beetl.properties"/>
  • spring 视图名使用了相对路径,错误
  1. return "userDetail.btl"

应该使用如下

  1. return "/user/user.btl"
  • Spring Boot 自定义模板根目录

如果模板不在resources/templates目录下,比如在resouces/pages/views下,应该用如下方式初始化

  1. ClasspathResourceLoader cploder = new ClasspathResourceLoader(BeetlTemplateConfig.class.getClassLoader(),
  2. "pages/views");
  3. beetlGroupUtilConfiguration.setResourceLoader(cploder);

如果以上办法如果还不行,请尝试调试ResourceLoader的exist的方法,找到加载模板不成功原因

5.8.2 开发模式下需改模板未刷新。

这种现象主要出现在idea +maven的工程里,因为idea默认情况下不会同步模板文件到target某,因此即使你修改了模板,beetl也看不到变化。解决办法可以参考 渔泯小镇

http://bbs.ibeetl.com/bbs/bbs/topic/612-1.html

如果是其他环境出现这个问题,请确认修改的模板是否同步到目标环境里

5.8.3 错误提示里有“directive dynamic "

Beetl使用FastRuntimeEngine有可能导致这个问题

  1. ENGINE=org.beetl.core.engine.FastRuntimeEngine

这个引擎会假设同一个模板里的同一个全局变量应该类型唯一,如果你的模板是公共模板,类型不一样,可以在模板顶部使用dynamic,比如

  1. <% directive dynamic xxx %>

如果你的模板这种情况很多,建议更换成默认引擎配置

  1. ENGINE=org.beetl.core.engine.DefaultTemplateEngine

还有种情况是在Spring Boot 下出现,参考下一节

5.8.4 Spring Boot 出现 ClassCastException

请使用最新的Beetl版本,使用Starter或者参考Spring Boot集成一章集成Spring Boot。这是Spring Boot dev模式引起的问题