添加 pfExceptionHandler 条件后未调用 PrimeFaces CommandButton actionListener

问题描述

点击按钮后 Ok actionListener 方法应该被调用oncomplete 工作并关闭对话框。 浏览器控制台中没有显示错误,请求看起来不错。

index.xhtml

...
<p:importEnum type="pl.obfo.enums.MessageType"/>
                <p:tab id="tab1" title="Nadgodziny">


                    ...

                    <p:ajaxExceptionHandler type="pl.obfo.exceptions.OverhourException"
                                            update="ovhrExceptionDialog"
                                            onexception="PF('ovhrExceptionDialog').show();" />

                    <p:dialog id="ovhrExceptionDialog" header="#{pfExceptionHandler.exception.type.value}" widgetvar="ovhrExceptionDialog"
                              appendTo="@(body)" modal="true" width="400" closable="#{pfExceptionHandler.exception.type == MessageType.WARN}">
                        <c:set var="isWarn" value="#{pfExceptionHandler.type == MessageType.WARN}" />
                        #{pfExceptionHandler.message} <br/>
                            <div style="text-align: center; margin-top:10; margin-bottom:7;">
                                <p:commandButton value="OK" resetValues="true" rendered="#{isWarn}"
                                                 actionListener="#{overhourBean.saveOverhour()}"
                                                 oncomplete="handleSaveOverhourWarnDlg(xhr,status,args)"
                                                 update=":tabView:overhoursTableForm :tabView:summaryTableForm overhoursTableForm managedOverhourDialog :growl"
                                                 >
                                    <f:actionListener binding="#{report.clearBalances()}"/>
                                    <f:actionListener binding="#{summaryBean.clearSummary()}"/>
                                </p:commandButton>
                                <p:commandButton value="OK" resetValues="true" rendered="#{!isWarn}"
                                                 actionListener="#{overhourBean.save()}"
                                                 oncomplete="handleSaveOverhourWarnDlg(xhr,args)"
                                                 update=":tabView:overhoursTableForm :tabView:summaryTableForm overhoursTableForm managedOverhourDialog :growl"
                                >
                                    <f:actionListener binding="#{report.clearBalances()}"/>
                                    <f:actionListener binding="#{summaryBean.clearSummary()}"/>
                                </p:commandButton>
                                <p:commandButton rendered="#{isWarn}" value="Anuluj" onclick="PF('ovhrExceptionDialog').hide();" style="margin-left:5"/>
                            </div>

                    </p:dialog>
...

OverhourBean.java

...
 public void saveOverhour() {
        overhourValidator.checkInfos(managedOverhour);
        save();
    }

    public void save() {
        boolean savedOk = false;
        try {
            managedOverhour.setResourceId(userBean.getCurrentUser());
            managedOverhour.setStatus(PENDING);
            managedOverhour.setCreatedAt(LocalDate.Now());
            overhourDAO.add(managedOverhour);
            savedOk = true;
            lastProject = managedOverhour.getProject();
            getCurrentInstance().addMessage(null,new FacesMessage(SEVERITY_INFO,"Nadgodziny zostały zapisane",null));
            log.infof("Zapisano nadgodziny dla projektu: %s - %s. Użytkownik: %s,dnia: %s,liczba godzin: %.2f",managedOverhour.getProject().getProjectId(),managedOverhour.getProject().getName(),userBean.getCurrentUser(),managedOverhour.getStartAt(),managedOverhour.getHours());

            syncReportWithGuiOnAdd();

        } catch (Exception e) {
            String msg = "Nie udało się utworzyć Nowej nadgodziny: " + e.getMessage();
            throw new SystemException(msg);
        }

        // parametr przekazywany do kontekstu JavaScript
        PrimeFaces.Ajax ajax = PrimeFaces.current().ajax();
        ajax.addCallbackParam("savedOk",savedOk);
    }
...

MessageType.java

public enum MessageType {
    WARN("Ostrzeżenie"),INFO("Informacja");

    String value;

    MessageType(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

OverhourException.java

...

@ApplicationException
public class OverhourException extends RuntimeException {
    private MessageType type;

    public OverhourException(String question) {
        this(question,MessageType.WARN);
    }

    public OverhourException(String question,MessageType type) {
        super(question);
        this.type = type;
    }

    public MessageType getType() {
        return type;
    }

    public void setType(MessageType type) {
        this.type = type;
    }
}

即使我替换为 pfExceptionHandler.type == 'pl.obfo.exceptions.OverhourException' 还是不行。 如果我用 isWarn 删除或替换 1 == 1 变量的条件,它工作得很好。 如果我用 commadButton value="OK" 替换 value="#{pfExceptionHandler.type == MessageType.WARN},则值返回 true

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)