当出现异常时,Primefaces会触发onerror

时间:2019-12-04 20:20:35

标签: jsf primefaces

对于一个大学项目,我们必须使用primefaces和spring boot创建一个网站。 我的问题在于错误处理。我有一个p:dialog,可让您编辑用户信息。保存用户后,对话框应关闭。但是,如果保存失败,则会出现错误消息,并且用户编辑对话框应保持打开状态。

这是触发保存的commandButton

<p:commandButton value="Save"
    action="#{userDetailController.doSaveUser()}"
    ajax="true"
    validateClient="true"
    oncomplete="if (args &amp;&amp; args.closeForm) PF('userEditDialog').hide()"
    update=":userForm:usersTable msgs mainPanel" />

如您所见,这是一个ajax请求,因此为了处理异常,我们使用了集成的PrimeExceptionHandlerFactory

<factory>
    <exception-handler-factory>org.primefaces.application.exceptionhandler.PrimeExceptionHandlerFactory</exception-handler-factory>
</factory>

发生异常时,我们还将显示一个对话框。

<p:ajaxExceptionHandler type="at.qe.sepm.skeleton.utils.GeneralExpectedException" update="exceptionDialog"
                        onexception="PF('exceptionDialog').show();" />
<p:dialog id="exceptionDialog"
          header="#{pfExceptionHandler.exception.type}"
          widgetVar="exceptionDialog"
          resizable="false">
    Message: #{pfExceptionHandler.message}
    <p:separator rendered="#{exceptionHelperBean.displayException(pfExceptionHandler.exception)}" />
    <h:outputText rendered="#{exceptionHelperBean.displayException(pfExceptionHandler.exception)}"
                  value="#{pfExceptionHandler.formattedStackTrace}"
                  escape="false" />
</p:dialog>

我的问题与这一行oncomplete="if (args &amp;&amp; args.closeForm) PF('userEditDialog').hide()"有关。仅当设置closeForm标志时,才会关闭用户编辑对话框。这是在服务器上完成的:

PrimeFaces.current().ajax().addCallbackParam("closeForm", true);

根据我对其他框架的了解,当发生异常时,服务器将返回HTTP 500和onerror触发器上的commandButton回调。

是否有更优雅的方法来做到这一点?理想情况下,我不希望oncomplete回调首先触发。我还尝试使用onsuccess回调,即使请求返回HTTP 200,该回调也不会被触发。

编辑:

这是doSaveUser内部的userDetailController方法:

public void doSaveUser() throws Exception {
    user = this.userService.saveUser(user);

    PrimeFaces.current().ajax().addCallbackParam("closeForm", true);
}

它在内部调用userServices保存方法,在此我手动引发异常:

public User saveUser(User user) throws Exception {
    if (user.isNew()) {
        User existingUser = userRepository.findFirstByUsername(user.getUsername());

        if(existingUser != null) {
            throw new GeneralExpectedException("User with name " + user.getUsername() + " already exists",
                    ExceptionType.WARNING);
        }

我希望这可以使问题更加清楚。保存已经存在的用户会引发异常-因此,用户编辑对话框应保持打开状态,以便进行调整。但是,我还希望触发“异常”对话框,以便您了解为什么无法保存。

谢谢您的帮助!

0 个答案:

没有答案