2017-02-22 26 views
1

если ${object} имеет нулевое значение, то его элементы посетили *{item} бы вызвать:thymeleaf собственности или поле не может быть найден на нуль

org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'item' cannot be found on null 

Так как решить эту проблему, и я хочу, чтобы иметь структуру DIV осталась, как и в в следующем примере, когда currentUser имеет значение null, 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

Я видел такую ​​ситуацию в проекте (но не проект весны). Подход состоял в том, что все пользователи, даже анонимные (не прошедшие проверку подлинности), были представлены экземпляром пользователя (например, или CurrentUser). Этот экземпляр был в основном пуст для анонимных пользователей. Идея заключалась в том, чтобы избавиться от нулевых проверок. Был специальный метод в классе , который ответил, если представленный пользователь аутентифицирован или нет. ИМО подход работал прилично в контексте используемого стека технологий.

Если это возможно для вашего проекта, вы также можете попробовать эту идею. Вы можете создать пустой экземпляр currentUser для анонимных пользователей. Тогда currentUser никогда не будет пустым. Но если вы используете безопасный диалект весны security + thymeleaf, вы можете использовать thymeleaf, чтобы определить, является ли пользователь анонимным, если это необходимо. Например. ссылка образца выхода из системы открыта для зарегистрированных пользователей только может быть обработан следующим образом:

<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 и добавьте дополнительные проверки.

+0

Я вернусь, когда попробую вашу идею. :) – Tiina