freemarker错误:预期哈希。而是评估为freemarker.template.SimpleScalar

时间:2012-07-24 18:17:18

标签: freemarker

我的模板如下所示:

  <#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 Sentiment 对象。方法 getSentimentType getScore 存在且有效。

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

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:0)

使用带有ninjaframework的swagger生成模型时出现相同的错误,通过在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());


    }



}