我的模板如下所示:
<#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 存在且有效。
那么,为什么我会收到错误?
答案 0 :(得分:7)
使用<#assign senti = "${scmr.results[model]}">
已将scmr.results[model]
转换为字符串(标量),这就是原因。只需写下<#assign senti = scmr.results[model]>
即可。在FreeMarker表达式中,您可以将值注入字符串文字,例如"Hello ${name}!"
(与"Hello " + name + "!"
相同),而"${someExpression}"
就是这种情况。它与JSP不同。
答案 1 :(得分:0)
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());
}
}