如果我将一个对象传递给模型并使用内置的“?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
答案 0 :(得分:2)
问题在于FreeMarker并不真正支持这种方法。 Java对象通过Configuration.objectWrapper
映射到某些模板语言值,并且模板仅看到该映射的结果。此外,模板语言具有与Java不同的类型系统,这是一种简单的,没有类的系统。 (当时的设计目标是,数据模型只是一棵简单的树,而模板仍然无法工作,因为它仍然提供相同的树。)?is_...
并非如此检查Java类型,但类型取决于模板语言。与通常的ObjectWrapper
-一个“通用”对象(意味着,诸如List
,Map
,Date
等无法识别的对象)一样,可以用作其值的字符串toString()
返回的是什么,就模板语言而言,它是一个字符串。有点像鸭子...
我能想到的一种解决方法是,首先使用?is_hash
检查该值,因为它将捕获所述通用对象(因为它们支持.
,所以它们也是哈希,而不仅仅是字符串) 。或者只是检查您希望在Test
中出现的属性。然后,在“ else”分支上,可以继续?is_string
。