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 情感对象。方法getSentimentType和getScore存在并正在工作。
那么,为什么我会收到错误?
答
With <#assign senti = "${scmr.results[model]}">
您已将scmr.results[model]
转换为String(标量),这就是原因。只需写<#assign senti = scmr.results[model]>
。在FreeMarker表达式中,您可以将值注入字符串文字,如"Hello ${name}!"
(与"Hello " + name + "!"
相同),"${someExpression}"
就是这种情况。这不像在JSP中。
答
使用具有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());
}
}
也看到过http://thread.gmane.org/gmane.comp.web.freemarker相同的错误。用户/ 5455 – sds 2012-07-26 13:03:16