mustache注入helper以及热加载问题解决

 
 
最近项目选用了mustache来代替velocity,由前端来完成所有的mustache模板的开发,后台只关注后端java代码的开发。
用的是spring mvc,模板解析的类用的是mustache自己开发的handlebars的类
自已定义了一些helper方法, 
<bean id="viewResolver"
class="com.github.jknack.handlebars.springmvc.HandlebarsViewResolver">
<property name="prefix" value="/WEB-INF/hbs" />
<property name="suffix" value=".hbs" />
<property name="helpers">
<map>
<entry key="imageURIBroker">
<bean class="com.taotaosou.tts.helper.ImageURIBrokerHelper" />
</entry>
<entry key="assign">
<bean class="com.taotaosou.tts.helper.AssignHelper" />
</entry>
<entry key="json">
<bean class="com.taotaosou.tts.helper.Jackson2Helper" />
</entry>
    ...
</map>
</property>
</bean>
出现了个怪异的问题,用run启动时会报
严重: StandardWrapper.Throwable
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'viewResolver' defined in class path resource [spring/mvc-context.xml]: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException:  No helper method was found in: java.util.LinkedHashMap
Debug时则不会这个错。
解决办法:
看了一下HandlebarsViewResolver的代码里有两个setHelper的注入方法
  public void setHelpers(final Map<String, Helper<?>> helpers) {
    notNull(helpers, "The helpers are required.");
    this.helpers.putAll(helpers);
  }
 
  public void setHelpers(final List<Object> helpers) {
    notNull(helpers, "The helpers are required.");
    this.helperSources.addAll(helpers);
  }
Run和Debug时分别会调用两个不同的方法,用helperSource去注册helper就会报错。
直接将第二个setHelpers重命名,并且springMVC里引用新改后的类,解决了这个问题。
<bean id="viewResolver" class="com.taotaosou.tts.mvc.HandlebarsViewResolver">
另外mustache里面, 模板改了需重启才能生效,也把mustache的缓存给关了,还是没用,发现是
spring mvc解析器里AbstractCachingViewResolver自带的cache的问题。
没有找到地方关,直接在子类HandlebarsViewResolver里关了,并打开mustache自带的cache
  protected Handlebars createHandlebars(final URLTemplateLoader templateLoader) {
    return new Handlebars(templateLoader);
  }
改为
protected Handlebars createHandlebars(final URLTemplateLoader templateLoader) {
        super.setCache(false);
        return new Handlebars(templateLoader).with( new ConcurrentMapTemplateCache());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值