Como usar && em expressões booleanas EL em Facelets?

83

Estou tendo um pouco de dificuldade para descobrir como fazer e está nas expressões EL no Facelets. Então, basicamente eu tenho:

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

Mas eu continuo recebendo:

Erro rastreado [linha: 69] O nome da entidade deve seguir imediatamente o '&' na referência da entidade.

Landister
fonte

Respostas:

162

Facelets é uma tecnologia de visualização baseada em XML. O &é um caractere especial em XML que representa o início de uma entidade como a &amp;que termina com o ;caractere. Você precisaria escapar disso, o que é feio:

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

ou usar a andpalavra - chave, que é preferida quanto à legibilidade e manutenção:

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

Veja também:


Não relacionado ao problema concreto, comparar booleanos com booleanos faz pouco sentido quando a expressão já espera um resultado booleano. Eu me livraria de == true:

rendered="#{beanA.prompt and beanB.currentBase != null}"
BalusC
fonte
2
A implementação JSF deve realmente reconhecer este caso e dar um melhor diagnóstico. É um problema simples, mas muito confuso para iniciantes.
Mike Braun
6

Além da resposta de BalusC, use o seguinte Java RegExp para substituir &&por and:

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

Você executou essa substituição de expressão regular várias vezes para encontrar todas as ocorrências, caso esteja usando> 2 literais em suas expressões EL. Lembre-se de substituir o # inicial por $ se a sintaxe de sua expressão EL for diferente.

Florian Sager
fonte