为什么FreeMarkers内置的“?is_string”对于某个对象返回true?

时间:2018-07-25 17:29:58

标签: spring-mvc freemarker

如果我将一个对象传递给模型并使用内置的“?is_string”对其进行测试,则它将错误地返回一个真值。 是否可以(不检查类名)对对象进行正确的类型检查?

FreeMarker:2.3.28

要复制的代码:

public class Test {} 

// In Test Controller
ModelAndView mv = new ModelAndView("test");
mv.addObject("tes", new Test());

// In test.ftl
<#if test?is_string>
  ${test} - is a string!
</#if>

// Result
Test@455b31c - is a string

1 个答案:

答案 0 :(得分:2)

问题在于FreeMarker并不真正支持这种方法。 Java对象通过Configuration.objectWrapper映射到某些模板语言值,并且模板仅看到该映射的结果。此外,模板语言具有与Java不同的类型系统,这是一种简单的,没有类的系统。 (当时的设计目标是,数据模型只是一棵简单的树,而模板仍然无法工作,因为它仍然提供相同的树。)?is_...并非如此检查Java类型,但类型取决于模板语言。与通常的ObjectWrapper-一个“通用”对象(意味着,诸如ListMapDate等无法识别的对象)一样,可以用作其值的字符串toString()返回的是什么,就模板语言而言,它是一个字符串。有点像鸭子...

我能想到的一种解决方法是,首先使用?is_hash检查该值,因为它将捕获所述通用对象(因为它们支持.,所以它们也是哈希,而不仅仅是字符串) 。或者只是检查您希望在Test中出现的属性。然后,在“ else”分支上,可以继续?is_string