2017-02-22 6 views
1

wenn ${object} ist null, dann seine Einzelteile besucht von *{item} verursachen würde zu finden:thymeleaf oder der Bereich kann nicht auf null

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

So wie diese zu lösen und ich möchte blieb die div Struktur haben, wie in Im folgenden Beispiel, wenn currentUser null ist, div enthält Stadt und Name bleibt.

<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> 

Antwort

0

Ich habe eine solche Situation in einem Projekt zu sehen (aber nicht eine Feder-Projekt). Der Ansatz bestand darin, dass alle Benutzer, selbst anonyme (nicht authentifizierte) Benutzer, durch eine Instanz repräsentiert wurden, z. B. (z. B. CurrentUser CurrentUser). Diese Instanz war für anonyme Benutzer größtenteils leer. Die Idee war, Null-Checks loszuwerden. Es gab eine dedizierte Methode in der Klasse Benutzer, die antwortete, wenn der dargestellte Benutzer authentifiziert wurde oder nicht. IMO hat der Ansatz im Kontext des verwendeten Technologie-Stacks gut funktioniert.

Wenn möglich für Ihr Projekt können Sie auch die Idee versuchen. Sie können eine leere currentUser Instanz für anonyme Benutzer erstellen. Dann wird currentUser niemals null sein. Aber wenn Sie Spring Security + Thymeleaf Sicherheitsdialekt verwenden, können Sie thymeleaf verwenden, um festzustellen, ob der Benutzer anonym ist, wenn dies erforderlich ist. Z.B. eine Probe Abmeldelink Benutzer für angemeldete nur sichtbar, wie dies gemacht werden kann:

<li sec:authorize="isAuthenticated()"> 
     <a href="#" class="log-out-link"> 
     <i class="fa fa-sign-out"></i> Log out 
     </a> 
</li> 

A @ControllerAdvice und @ModelAttribute kann die Benutzerdarstellung in allen relevanten Ansichten schieben. Alternativ können Sie einen separaten, leeren Benutzer in der Ansicht bereitstellen und etwas wie th:object="${#objects.nullSafe(currentUser,emptyUser)}"

verwenden. Wenn dies zu viel ist, verwenden Sie nicht die th:object und fügen Sie einige zusätzliche Prüfungen hinzu.

+0

Ich wäre wieder da, wenn ich deine Idee versuche. :) – Tiina

Verwandte Themen