freemarker错误:期望的散列。而不是评估,以freemarker.template.SimpleScalar

问题描述:

我的模板看起来是这样的:freemarker错误:期望的散列。而不是评估,以freemarker.template.SimpleScalar

<#assign senti = "${scmr.results[model]}"> 
    <#if senti??> 
     <td>${senti} ---- ${senti.sentimentType}</td> 
     <td>${senti.score?html}</td> 
    </#if> 

输出看起来是这样的:

POSITIVE(1.0/1) ---- Expected hash. senti evaluated instead to freemarker.template.SimpleScalar on line 5, column 27 in com/addthis/sentiment/sentidemo.ftl. 

之前的输出文本 “----” 表示senti确实是一个有效的java 情感对象。方法getSentimentTypegetScore存在并正在工作。

那么,为什么我会收到错误?

With <#assign senti = "${scmr.results[model]}">您已将scmr.results[model]转换为String(标量),这就是原因。只需写<#assign senti = scmr.results[model]>。在FreeMarker表达式中,您可以将值注入字符串文字,如"Hello ${name}!"(与"Hello " + name + "!"相同),"${someExpression}"就是这种情况。这不像在JSP中。

+0

也看到过http://thread.gmane.org/gmane.comp.web.freemarker相同的错误。用户/ 5455 – sds 2012-07-26 13:03:16

使用具有ninjaframework昂首阔步生成的模型,通过在CONF包添加以下类固定时

package conf; 

import com.google.inject.Inject; 
import freemarker.ext.beans.BeansWrapper; 
import freemarker.ext.beans.MethodAppearanceFineTuner; 
import freemarker.template.Configuration; 
import freemarker.template.DefaultObjectWrapperBuilder; 
import ninja.NinjaDefault; 
import ninja.template.TemplateEngineFreemarker; 

/** 
* Created by varya on 07/12/17. 
*/ 
public class Ninja extends NinjaDefault { 
    @Inject 
    protected TemplateEngineFreemarker templateEngineFreemarker; 

    @Override 
    public void onFrameworkStart() { 
     super.onFrameworkStart(); 

     Configuration freemarkerConfiguration = templateEngineFreemarker.getConfiguration(); 
     DefaultObjectWrapperBuilder owb = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_23); 
     owb.setMethodAppearanceFineTuner(new MethodAppearanceFineTuner() { 
      @Override 
      public void process(BeansWrapper.MethodAppearanceDecisionInput in, BeansWrapper.MethodAppearanceDecision out) { 
       out.setMethodShadowsProperty(false); 
      } 
     }); 

     freemarkerConfiguration.setObjectWrapper(owb.build()); 


    } 



}