Отображение сообщения об ошибке, которая происходит в получателе, а не в действии - PullRequest
2 голосов
/ 12 января 2012

Мой!

У меня есть ситуация, когда я пытаюсь отобразить сообщение об ошибке, используя p:message для исключения, которое возникает в геттере.Но это приводит к сообщению "WARNUNG: There are some unhandled FacesMessages, this means not every FacesMessage had a chance to be rendered.".

Я делаю следующее, чтобы прикрепить сообщение к FacesContext:

FacesContext.getCurrentInstance().addMessage(cliendId, getFacesMessage(severity, msgKey, args));

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

Есть ли способ создать сообщение в геттере, а не в действии?Может быть, можно сбросить фазу рендеринга?

Ответы [ 3 ]

4 голосов
/ 12 января 2012

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

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

Получатель вызывается во время рендеринга представления. В вашем конкретном случае, метод получения, по-видимому, вызывается после , когда <p:messages> рендерится, и поэтому у него никогда не будет возможности показать сообщение лиц, которое было добавлено позже.

Вместо этого переместите бизнес-задачу в конструктор (post) или метод прослушивания (action) компонента поддержки.

например. в постконструктивном методе:

@PostConstruct
public void init() {
    try {
        data = loadFromWebservice();
    } catch (SomeException e) {
        log(e);
        addFacesMessage();
    }
}

Конечно, вы также можете переместить <p:messages> в самый низ страницы (и при необходимости переместить его с помощью CSS), но это скорее обходной путь, чем решение.

Смотри также:

1 голос
/ 12 января 2012

p: сообщение говорит, что вы используете PrimeFaces. Это, вероятно, AJAX-вызов, и компонент p: message не обновляется при этом вызове. Это распространенная ошибка.

0 голосов
/ 09 декабря 2013

альтернатива, вы можете использовать <p:growl>, чтобы показать вам FacesMessages, тоже.

<p:message> работает аналогично <p:growl>.

Оба, <p:message> и <p:growl> способныпоказать конкретные FacesMessages.Всегда проверяйте настройки серьезности.

Если вы используете, например:

<p:growl id="growl" showDetail="true" severity="info,warn" sticky="false"/>
<p:growl id="errorGrowl" showDetail="true" severity="error" sticky="true" />

, создайте FacesMessage с ошибкой серьезности и поместите его в ложный компонент (рычание), вы получите сообщение «ПРЕДУПРЕЖДЕНИЕ: Есть некоторые необработанные сообщения FacesMessages, это означает, что не каждый FacesMessage имел шанс быть обработанным. "

Правильный способ показать ваше сообщение об ошибке:

public void saveError( FacesMessage facesMessage )
{
    FacesContext.getCurrentInstance().addMessage( "errorGrowl", facesMessage );
    update( "errorGrowl" );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...