
freemarker 模板中访问布尔属性时,若直接使用 `isxxx` 方法名(如 `isotherinsurance`)会导致类型错误,因其被解析为方法对象而非布尔值;应改用标准 javabean 属性名 `otherinsurance` 或显式调用 `isotherinsurance()`。
在 FreeMarker 中,对 Java 对象属性的访问遵循 JavaBean 规范。当后端定义了一个布尔类型的 getter 方法 public boolean isOtherInsurance() 时,FreeMarker 不会自动将其映射为 isOtherInsurance 属性,而是将其识别为一个可调用的方法(即 method+sequence),因此 实际上引用的是方法本身,而非其返回值 —— 这正是报错 Expected a boolean, but this has evaluated to a method+sequence 的根本原因。
✅ 正确做法有以下两种:
1. 使用标准 JavaBean 属性名(推荐)
根据 JavaBean 规范,boolean isXxx() 方法对应的标准属性名为 xxx(首字母小写,去掉 is 前缀)。因此应写作:
<#if documentData.otherInsurance>✔ Да
<#else>✘ Нет
#if>
此写法简洁、语义清晰,且完全符合 FreeMarker 对 JavaBean 属性的默认解析逻辑。
2. 显式调用方法(兼容非常规命名)
若因历史原因无法修改 Java 类(例如方法声明为 Boolean isOtherInsurance() 或 boolean getIsOtherInsurance()),则必须通过括号 () 显式调用以获取返回值:
<#if documentData.isOtherInsurance()>✔ Да
<#else>✘ Нет
#if>
⚠️ 注意事项:
- 不要写成 —— ${...} 是插值语法,仅用于输出文本,不能嵌套在指令(如 #if)中,否则会触发语法错误;
- 避免使用 !false 等默认值修饰符来“绕过”类型问题(如 documentData.isOtherInsurance!false),这无法解决方法未调用的本质问题;
- 若 Java 方法返回 Boolean(包装类),需确保其不为 null,否则可能引发空指针异常;此时建议统一使用 boolean 原生类型,或在模板中加空值安全判断:。
总结:FreeMarker 的属性访问本质是反射调用 getter,务必区分「方法引用」与「方法调用」。优先遵循 JavaBean 命名规范(用 otherInsurance),既提升可读性,也避免运行时类型歧义。










