对于一个大学项目,我们必须使用primefaces和spring boot创建一个网站。
我的问题在于错误处理。我有一个p:dialog
,可让您编辑用户信息。保存用户后,对话框应关闭。但是,如果保存失败,则会出现错误消息,并且用户编辑对话框应保持打开状态。
这是触发保存的commandButton
:
<p:commandButton value="Save"
action="#{userDetailController.doSaveUser()}"
ajax="true"
validateClient="true"
oncomplete="if (args && 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 && 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);
}
我希望这可以使问题更加清楚。保存已经存在的用户会引发异常-因此,用户编辑对话框应保持打开状态,以便进行调整。但是,我还希望触发“异常”对话框,以便您了解为什么无法保存。
谢谢您的帮助!