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
相关产品推荐
相关产品推荐

