如果${object}
为空,则*{item}
访问的项目将导致:
org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'item' cannot be found on null
所以如何解决这个问题,我想保留div结构,如下例所示,当currentUser
为空时,div
包含城市和名称仍然存在。
<div class="form" th:object="${currentUser}">
<div class="form-group form-group-sm">
<label>city:</label>
<span id="details_city" th:text="*{address == null ? '' : address.city}">Hongkong</span>
</div>
<div class="form-group form-group-sm">
<label>name:</label>
<span id="details_username" th:text="*{name}">Jane</span>
</div>
</div>
答案 0 :(得分:0)
我在项目中看到过这种情况(但不是春季项目)。方法是所有用户,甚至匿名(未经过身份验证),都由用户(例如, CurrentUser )实例表示。对于匿名用户,此实例大多是空的。想法是摆脱空检查。 User 类中有一个专用方法,可以回答代表的用户是否经过身份验证。 IMO的方法在所使用的技术堆栈的背景下运行良好。
如果您的项目可行,您也可以尝试这个想法。您可以为匿名用户创建一个空的currentUser
实例。然后currentUser
永远不会为空。但是,如果您使用春季安全+百里香安全方言,您可以使用百日咳来确定用户是否是匿名的(如果有必要)。例如。只有登录用户可见的示例注销链接可能会像这样呈现:
<li sec:authorize="isAuthenticated()">
<a href="#" class="log-out-link">
<i class="fa fa-sign-out"></i> Log out
</a>
</li>
@ControllerAdvice
和@ModelAttribute
可以在所有相关视图中推送用户表示。或者,您可以在视图中提供单独的空用户,并使用th:object="${#objects.nullSafe(currentUser,emptyUser)}"
如果这太多了,请不要使用th:object
并添加一些额外的支票。
答案 1 :(得分:0)
在我看来,您有两个选择: