Получение текущих глобальных сообщений от FacesContext - PullRequest
2 голосов
/ 22 сентября 2011

У меня проблема.Мне нужно знать, есть ли на моей странице глобальные ошибки или нет.Это потому, что у меня есть 2 разных h:messages (контейнеры с ошибками)

<h:messages id="errorMsgsContainer"
layout="table" 
rendered="true"
styleClass="message-container error-message" 
infoClass="info" 
errorClass=" error" warnClass="warn-message warn" globalOnly="true"/>

<h:messages id="errorMsgsContainerValidation"
layout="table" 
styleClass="message-container error-message-validation" 
infoClass="info" 
errorClass="error" globalOnly="false"/>

Один покажет сообщения, связанные с бизнесом, а другой просто покажет сообщения проверки.Есть два messages из-за требований бизнеса.

Когда выдаются сообщения об ошибках валидации, лицевая сторона работает нормально, потому что один из тегов messages имеет пару атрибут-значение globalOnly="true".

Проблема возникает, когда яглобальная ошибкаОн появится в обоих полях.

Я хочу знать, являются ли какие-либо из этих ошибок глобальными, поэтому я не показываю контейнер проверки, пока глобальные ошибки не будут исправлены пользователем в моей форме.

Я пытался получить его через FacesContext с помощью

FacesContext.getCurrentInstance().getMessageList().get(i).getSeverity()

и некоторых других команд, но, похоже, он не работает.

Пожалуйста, помогите мне решить эту проблему,Как я могу получить текущий глобальный список сообщений, чтобы я мог знать, есть ли глобальная ошибка?

Ответы [ 2 ]

3 голосов
/ 22 сентября 2011

Когда генерируются сообщения об ошибках валидации, лицевая сторона работает нормально, поскольку один из тегов сообщений имеет пару атрибут-значение globalOnly = "true".

Это неверно. Вы видите сообщения об ошибках проверки в другом теге h:messages с парой атрибут-значение globalOnly="false". Сообщения проверки всегда имеют идентификатор клиента, который является идентификатором элемента формы, который не прошел проверку, и, следовательно, будет отображаться в теге messages, который позволяет отображать неглобальные сообщения, или имеет значение for атрибут установлен на соответствующий идентификатор.

Проблема возникает, когда у меня глобальная ошибка. Он появится в обоих полях.

Это ожидаемое поведение. Я полагаю, вы запутали значение атрибута globalOnly. Когда значение атрибута globalOnly равно true, будут отображаться только глобальные сообщения (т.е. сообщения без идентификатора клиента); когда значение равно false, глобальные сообщения будут отображаться в дополнение к другим сообщениям, которые уже поставлены в очередь. Это объясняет, почему глобальные сообщения отображаются дважды - первый тег h:messages будет отображать глобальное сообщение, потому что он должен отображать только глобальные сообщения, а второй отображать его, потому что он может отображать его.

Пожалуйста, помогите мне решить эту проблему. Как я могу получить текущий глобальный список сообщений, чтобы я мог знать, есть ли глобальная ошибка?

Если вы хотите продолжить иметь два h:messages тега в своем лицевом стекле, тогда вы можете использовать «псевдоглобальный» Id при постановке в очередь ваших FacesMessage s для отображения вместо указания Id в null; значение псевдоглобального идентификатора в следующем примере - inputForm, который является действительным идентификатором клиента (в форме), который не будет иметь никаких сообщений проверки, созданных в этом случае:

FacesContext.getCurrentInstance().addMessage("inputForm", new FacesMessage(FacesMessage.SEVERITY_INFO, "Added a global message", null));

Затем можно добавить выражение EL для отображения тега messages, отвечающего за отображение сообщений проверки ввода:

<html xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:fn="http://java.sun.com/jsp/jstl/functions">
...
    <h:form id="inputForm">
    ...
    </h:form>
    <h:messages id="psuedoGlobalMessages" for="inputForm" globalOnly="true" infoStyle="color:green" errorStyle="color:red" warnClass="color:orange" />
    <h:messages id="clientMessages" rendered="#{fn:length(facesContext.getMessageList('inputForm')) == 0}" globalOnly="false" infoStyle="color:green" errorStyle="color:red" warnClass="color:orange" />
...

Обратите внимание, что атрибут globalOnly используется только в одном теге messages. Тот же тег messages также не отображается, если псевдоглобальное сообщение ставится в очередь для отображения через выражение EL, указанное в атрибуте rendered. Вы также можете использовать идентификатор клиента скрытого элемента формы, созданного специально для направления всех псевдоглобальных сообщений, вместо идентификатора клиента формы.

0 голосов
/ 31 июля 2015

Попробуйте это:

rendered="#{not empty facesContext.getMessageList('inputForm')}

вместо:

rendered="#{fn:length(facesContext.getMessageList('inputForm')) == 0}"

в ответе Винет Рейнольдс.

...