Spring mvc 为什么FreeMarkers是内置的;?是“U字串”;为对象返回true?

Spring mvc 为什么FreeMarkers是内置的;?是“U字串”;为对象返回true?,spring-mvc,freemarker,Spring Mvc,Freemarker,如果我将一个对象传递到模型中并使用内置的“?is_string”测试它,它将错误地返回一个真值。 是否可以(不检查类名)对对象进行适当的类型检查 自由标记:2.3.28 要复制的代码: public class Test {} // In Test Controller ModelAndView mv = new ModelAndView("test"); mv.addObject("test", new Test()); // In test.ftl <#if test?is_st

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

自由标记:2.3.28

要复制的代码:

public class Test {} 

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

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

// Result
Test@455b31c - is a string
公共类测试{}
//测试控制器
ModelAndView mv=新ModelAndView(“测试”);
mv.addObject(“test”,newtest());
//在test.ftl中
${test}-是一个字符串!
//结果
Test@455b31c-这是一根绳子

问题在于FreeMarker并不真正支持这种方法。Java对象通过
Configuration.objectWrapper
映射到一些模板语言值,模板只看到映射的结果。此外,模板语言有一个与Java不同的类型系统,一个简单的系统,没有类。(当时的设计目标是,数据模型只是一个简单的树,模板将在任何对象后面都能工作,因为它仍然提供相同的树。)
?is_551;
不检查Java类型,而是根据模板语言检查类型。与通常的
ObjectWrapper
-s一样,一个“通用”对象(意思是说,不能像
列表
映射
日期
等那样被识别)可以用作字符串,其值是
toString()
返回的值,就模板语言而言,它是一个字符串。这是一种鸭子式的


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

谢谢您的解释。我创建了一个helper函数:它现在返回预期的结果。