You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot+Thymeleaf中CommonResponse布尔属性判断报错问题

问题分析与解决方案

这种情况通常由两个常见原因导致,咱们一步步排查:

1. CommonResponse对象未正确传入Model

首先检查你的Controller代码:如果只把isLoggedIn作为独立属性通过model.addAttribute("isLoggedIn", ...)传入视图,但没有把整个CommonResponse实例通过model.addAttribute("commonResponse", yourCommonResponseObj)添加到Model里,那模板里的${commonResponse.isLoggedIn}就会因为commonResponse是null而抛出空指针,进而导致表达式解析错误。

而你直接用${isLoggedIn}能正常运行,恰恰是因为这个独立属性已经被正确放入Model中了。

2. CommonResponse的getter方法不符合JavaBean规范

Thymeleaf依赖Spring EL解析表达式,而Spring EL严格遵循JavaBean规范来访问对象属性:

  • 对于基本boolean类型的属性,规范要求:
    • 如果属性名是loggedIn(不含is前缀),对应的getter方法应该是public boolean isLoggedIn()
    • 如果属性名是isLoggedIn(带is前缀),对应的getter方法需要是public boolean isIsLoggedIn()(这种命名方式不推荐,会增加代码可读性负担)

如果你的CommonResponse类中,isLoggedIn属性的getter方法不符合这个规范,Spring EL就无法找到对应的属性,从而抛出模板处理异常。

举个例子:

错误示范(属性名带is前缀但getter不匹配)

public class CommonResponse {
    private boolean isLoggedIn;
    // 这里getter方法名和属性名冲突,Spring EL找不到对应的属性
    public boolean isLoggedIn() {
        return isLoggedIn;
    }
}

正确示范一(推荐:属性名去掉is前缀)

public class CommonResponse {
    private boolean loggedIn;
    public boolean isLoggedIn() {
        return loggedIn;
    }
}
// 模板中使用:${commonResponse.loggedIn}

正确示范二(保留is前缀属性名,调整getter)

public class CommonResponse {
    private boolean isLoggedIn;
    public boolean isIsLoggedIn() {
        return isLoggedIn;
    }
}
// 模板中使用:${commonResponse.isLoggedIn}

额外优化建议

你还可以简化Thymeleaf的表达式写法,用!代替== false,更简洁直观:

<li class="nav-item hide-on-scroll" id="sign_in_menu" th:style="${!commonResponse.loggedIn ? '' : 'display:none'} ">
  <a class="nav-link" data-toggle="modal" data-target="#loginModal">Sign in</a>
</li>

内容的提问来源于stack exchange,提问作者user3692033

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:27:35