thymeleaf无法在null上找到属性或字段

时间:2017-02-22 05:43:24

标签: thymeleaf

如果${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>

2 个答案:

答案 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)

在我看来,您有两个选择:

  • 无论如何都要传递一个对象实例(字段值为空)或
  • 复制你的 div 结构,一个是 th:if="${object != null}",一个是 th:if="${object == null}