Как использовать && в EL булевых выражениях в Facelets?

У меня есть небольшая проблема, когда я выясняю, как это сделать и на выражениях EL в Facelets. Так что в основном я:

<h:outputText id="Prompt"
    value="Fobar" 
    rendered="#{beanA.prompt == true && beanB.currentBase !=null}" />

Но я продолжаю получать:

Ошибка трассировки [строка: 69] Имя объекта должно немедленно следовать за символом '&' в ссылке на объект.

Ответ 1

Facelets - это технология просмотра на основе XML. & представляет собой специальный символ в XML, представляющий начало объекта типа &amp;, который заканчивается символом ;. Вам нужно либо сбежать, что уродливо:

rendered="#{beanA.prompt == true &amp;&amp; beanB.currentBase != null}"

или вместо этого использовать ключевое слово and, что является предпочтительным для удобства чтения и обслуживания:

rendered="#{beanA.prompt == true and beanB.currentBase != null}"

См. также:


Несвязанный к конкретной проблеме, сравнение булевых элементов с булевыми значениями маловероятно, когда выражение ожидает булевский результат. Я бы избавился от == true:

rendered="#{beanA.prompt and beanB.currentBase != null}"

Ответ 2

В дополнение к ответу BalusC, используйте следующий Java RegExp, чтобы заменить && на and:

Search:  (#\{[^\}]*)(&&)([^\}]*\})
Replace: $1and$3

Вы использовали эту регулярную замену выражений несколько раз, чтобы найти все вхождения, если вы используете > 2 литерала в ваших выражениях EL. Ум, чтобы заменить ведущий # на $, если ваш синтаксис выражения EL отличается.