webentwicklung-frage-antwort-db.com.de

null check in jsf expression language

Bitte sehen Sie diese Ausdruckssprache

styleClass="#{obj.validationErrorMap eq null ? ' ' :  
     obj.validationErrorMap.contains('key')?'highlight_field':'highlight_row'}"

Auch wenn die Map null ist, wird der Stil highlight_row Angewendet.

Also wechselte ich zu

styleClass="#{empty obj.validationErrorMap ? ' ' :  
     obj.validationErrorMap.contains('key')?'highlight_field':'highlight_row'}"

Selbst dann wird highlight_row Angewendet.
Wenn die Karte empty OR null ist, möchte ich nicht, dass ein Stil angewendet wird.

Irgendeine Hilfe? und Gründe für dieses Verhalten?

51
crazyTechie

Verwenden Sie empty (es überprüft sowohl die Nullheit als auch die Leerheit) und gruppieren Sie den verschachtelten ternären Ausdruck in Klammern (EL ist in bestimmten Implementierungen/Versionen nämlich etwas problematisch mit verschachtelten ternären Ausdrücken). Also, so:

styleClass="#{empty obj.validationErrorMap ? ' ' :  
 (obj.validationErrorMap.contains('key') ? 'highlight_field' : 'highlight_row')}"

Wenn immer noch vergebens (ich würde dann JBoss EL-Konfigurationen überprüfen), verwenden Sie den "normalen" EL-Ansatz:

styleClass="#{empty obj.validationErrorMap ? ' ' :  
 (obj.validationErrorMap['key'] ne null ? 'highlight_field' : 'highlight_row')}"

Update : Wie aus den Kommentaren hervorgeht, ist das Map tatsächlich ein List (bitte arbeiten Sie an Ihren Namenskonventionen) . Verwenden Sie JSTL fn:contains , Um zu überprüfen, ob List ein Element auf "normale" Weise enthält = (obwohl nicht explizit dokumentiert, funktioniert es auch für List).

styleClass="#{empty obj.validationErrorMap ? ' ' :  
 (fn:contains(obj.validationErrorMap, 'key') ? 'highlight_field' : 'highlight_row')}"
78
BalusC