JSF FacesMessage отображается только один раз, но должен отображаться каждый раз, когда возникает ошибка - PullRequest
0 голосов
/ 12 февраля 2020

Я использую JSF 2.3 (Mojarra 2.3.9.SP02) и PrimeFaces 7.0, работающие на WildFly 17 (Ubuntu 18.04 TLS / или Windows 10). В моем методе действия weiterBid() в компоненте поддержки (который является ViewScoped) я выполняю проверку, если пользователь только что установил флажок. Если нет, то сообщение об ошибке отображается красным цветом в компоненте <p:panel id="errorMsgPanelId" (см. Ниже лицевой стороны), и пользователь остается на той же странице. Эта проверка выполняется каждый раз, когда пользователь нажимает кнопку «Далее».

Теперь я понимаю, что даже когда пользователь закрывает панель сообщений об ошибках, каждый раз, когда он нажимает кнопку «Далее» ", вызывается метод действия, и проверка, проверял ли пользователь флажок, выполняется снова и снова. Если флажок не установлен, то сообщение об ошибке должно быть снова показано в том же компоненте <p:panel id="errorMsgPanelId">, что и раньше. Это действительно предполагаемое поведение? Если да, то у меня есть ошибка, что сообщение об ошибке отображается только при первом нажатии на кнопку «Далее» и никогда не показывается снова, как только пользователь закрывает панель, показывающую его.

Минимальная рабочая пример проекта на github:

https://github.com/alexmivonwien/pf.error.msg

Мой поддерживающий компонент:

    @Named("aveBidUnterlagenBean")
    @javax.faces.view.ViewScoped
    public class AveBidUnterlagenBean implements Serializable {

        private boolean confirmationDocumentsGiven;

        private FacesMessage errorMessageOnDocumentConfirmation;

        public boolean isConfirmationDocumentsGiven() {
            return confirmationDocumentsGiven;
        }

        public void setConfirmationDocumentsGiven(boolean confirmationDocumentsGiven) {
            this.confirmationDocumentsGiven = confirmationDocumentsGiven;

        }

        public String weiterBid() {
            if (!confirmationDocumentsGiven) {
                String errorMessage = "Please confirm documents for the real estate";

                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, null);
                FacesContext.getCurrentInstance().addMessage(null, message);
                this.errorMessageOnDocumentConfirmation = message;
                return null;
            }

            return null;
        }   

        public FacesMessage getErrorMessageOnDocumentConfirmation() {
            return errorMessageOnDocumentConfirmation;
        }

        public void onCloseErrorMsgPanel(CloseEvent event) {
            this.errorMessageOnDocumentConfirmation = null;
        }
    }

В фасете у меня есть компонент

    <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui">
<h:head>
    <meta charset="UTF-8"/> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</h:head>
        <h:outputStylesheet name="primeicons/primeicons.css" library="primefaces"/>
        <h:form id="persDatenForm">  
                <p:panel id="errorMsgPanelId" styleClass="errorMsgPanel" closable="true" widgetVar="errorMsgPanel" rendered="#{aveBidUnterlagenBean.getErrorMessageOnDocumentConfirmation()!=null}">
                   <p:ajax event="close" listener="#{aveBidUnterlagenBean.onCloseErrorMsgPanel}" update="@parent" />
                   <h:outputText style="color:red;" value="#{aveBidUnterlagenBean.errorMessageOnDocumentConfirmation.detail}"/>
                   <p:commandLink outcome="#" style="background-color:white;" onclick="PF('errorMsgPanel').close()">
                        <i class="pi pi-times"></i>
                   </p:commandLink>
                </p:panel>
                <br/>
                <p:outputLabel value="Documents overwiev"/>
                <br/>
                <br/>
                <p:selectBooleanCheckbox value="#{aveBidUnterlagenBean.confirmationDocumentsGiven}" itemLabel="I confirm that I read the documents"/>
                <br/>
                <br/>
                <p:commandButton  icon = "pi pi-check" value="Next" action="#{aveBidUnterlagenBean.weiterBid}" update="@form"/>
         </h:form>  
</html>

Теперь моя проблема заключается в том, что если я не установил флажок и впервые щелкаю кнопку «Далее», вызывается метод действия и отображается сообщение об ошибке. Если я закрываю панель сообщений об ошибках и затем снова нажимаю на ту же кнопку «Далее», не установив флажок, сообщение об ошибке больше никогда не отображается.

Это ошибка или функция? Как я мог это преодолеть?

Спасибо и всего наилучшего: Алекс

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Это обходной путь, надеюсь, он решит вашу проблему.
<p:panel id="errorMsgPanelId" styleClass="errorMsgPanel" closable="true" widgetVar="errorMsgPanel">
<p:outputPanel id="wrapper" rendered="#{aveBidUnterlagenBean.getErrorMessageOnDocumentConfirmation() != null}">
<h:outputText style="color:red;" value="#{aveBidUnterlagenBean.errorMessageOnDocumentConfirmation.detail}"/>
<p:commandLink style="background-color:white;" actionListener="#{aveBidUnterlagenBean.onCloseErrorMsgPanel}" update="@form" process="@this">
<i class="pi pi-times"/>
</p:commandLink>
</p:outputPanel>
</p:panel>

И измените метод поддерживающего компонента следующим образом: public void onCloseErrorMsgPanel() { this.errorMessageOnDocumentConfirmation = null; }

0 голосов
/ 12 февраля 2020

Обновление выполняется после действия. Вместо этого используйте actionListener:

<p:commandButton  icon = "pi pi-check" value="Next" actionListener="#{aveBidUnterlagenBean.weiterBid}" update="@form"/>

обновление вызывается после actionListener, но перед действием, я думаю, из-за этого представление уже обновлено. Таким образом, ваш bean-компонент AddressDocumentsGiven имеет значение false, но он никогда не обновляется до правильного FacesContext.

(я не проверял это)

Хорошо, я думаю, проблема в

rendered="#{aveBidUnterlagenBean.getErrorMessageOnDocumentConfirmation()!=null}". 

В вашем onCloseErrorMsgPanel вы устанавливаете для errorMessage значение null.

Первое посещение: работает, errormsg установлено, закрыть диалоговое окно -> сообщение об ошибке равно NULL, обновить @parent -> панель отображается = false, затем вызывается действие -> все значения на стороне сервера верны, однако

2nd Посетите: update = "@ form" или общее ajax обновление пропустит все компоненты с render = false

Что делать? Используйте действие, которое устанавливает errormsg = / = PlaceHolder.NotNull, затем вызывается обновление, панель (отображается = истина, потому что errormsg = / = null) загружается, чем с помощью actionlistener, который вы устанавливаете errormsg = actualValue.

Таким образом, панель должна обновляться и содержаться в вашей DOM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...