为什么我的自定义 javax.faces.context.ExceptionHandler 不处理 javax.validation.ConstraintViolationException

问题描述

容器没有调用我的自定义异常处理程序来拦截(已检查或未检查)异常(我通过调试器进行了验证)。我有这个带有@Email 注释的 Entity bean 类用于电子邮件字段,当用户通过 JSF 页面输入无效电子邮件时,会显示一条错误消息,但是,该错误消息不是我通过自定义设置的异常处理程序类,而是我将其设置为 @Email 注释的默认消息的类。自定义异常处理程序生成的错误消息具有前缀字符串“自定义异常处理程序捕获的异常:”。我推测无效的电子邮件应该抛出 ConstraintViolationException,这将是异常处理程序捕获的理想情况。

JSF 页面允许更新用户信息,因此当我用无效的电子邮件更新用户的电子邮件并单击“更新”命令按钮时,不会调用已注册的操作方法(我通过调试器验证了它)。此外,我似乎没有弄清楚,当 JSF 页面上显示“无效电子邮件”错误消息时,“添加用户”命令按钮被禁用,因此我无法导航到“添加用户” JSF 页面。知道为什么异常处理程序和页面导航(添加用户)在出现错误时不起作用?

public class CustomExceptionHandler extends ExceptionHandlerWrapper {

    private ExceptionHandler wrapped;
    private final static Logger logger = Logger.getLogger(CustomExceptionHandler.class.getName());

    public CustomExceptionHandler(ExceptionHandler w) {
        wrapped = w;
    }

@Override
  public ExceptionHandler getWrapped() {
    return wrapped;
  }

  @Override
  public void handle() throws FacesException {
    Iterator iterator = getUnhandledExceptionQueuedEvents().iterator();
    
    while (iterator.hasNext()) {
      ExceptionQueuedEvent event = (ExceptionQueuedEvent) iterator.next();
      ExceptionQueuedEventContext context = (ExceptionQueuedEventContext)event.getSource();
 
      Throwable throwable = context.getException();
      
      FacesContext fc = FacesContext.getCurrentInstance();
      
      try {
          Flash flash = fc.getExternalContext().getFlash();
          
          // Put the exception in the flash scope to be displayed in the error 
          // page if necessary ...
          String errorMessage = "Exception caught by the custom Exception handler: "+throwable.getMessage();
          logger.severe(errorMessage);
          flash.put("errorDetails",errorMessage);
          
          
          NavigationHandler navigationHandler = fc.getApplication().getNavigationHandler();
          
          //navigationHandler.handleNavigation(fc,null,"/loginmanagement");
          navigationHandler.handleNavigation(fc,"error?faces-redirect=true");
          
          fc.renderResponse();
      } finally {
          iterator.remove();
      }
    }
    
    // Let the parent handle the rest
    getWrapped().handle();
  }
}

工厂类: 公共类 CustomExceptionHandlerFactory 扩展 ExceptionHandlerFactory { 私有 ExceptionHandlerFactory 父级;

  public CustomExceptionHandlerFactory(ExceptionHandlerFactory parent) {
    this.parent = parent;
  }
 
  @Override
  public ExceptionHandler getExceptionHandler() {
    ExceptionHandler result = new CustomExceptionHandler(parent.getExceptionHandler());
    return result;
  }
}

faces-config.xml

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.3"
              xmlns="http://xmlns.jcp.org/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_3.xsd">

    <application>
        <resource-bundle>
            <base-name>webmessages</base-name>
            <var>bundle</var>
        </resource-bundle>
        <locale-config>
            <default-locale>en</default-locale>
            <!--      <supported-locale>es</supported-locale>   -->
        </locale-config>
    </application>
    <error-page>
        <exception-type>java.lang.RuntimeException</exception-type>
        <location>/loginmanagement.xhtml</location>
    </error-page> 
    <factory>
        <exception-handler-factory>
            org.me.mavenlistservicedb.applicationexception.CustomExceptionHandlerFactory
        </exception-handler-factory>
    </factory>
</faces-config>

这是JSF页面的相关摘录

<h:column>
                            <f:facet name="header">#{bundle.loginmanagementemail}</f:facet>
                            <h:inputText value = "#{l.email}"
                                         size ="30" rendered = "#{l.canUpdate}" />
                            <h:outputText value = "#{l.email}"
                                          rendered = "#{not l.canUpdate}" />
</h:column>
 <f:facet name="footer">
                        <h:panelGroup style="display: block; border-color: aquamarine;text-align: center;">

                            <h:commandButton id="update"
                                             value="Save updates"
                                             action="#{loginManagment.saveUpdate}" />
                            <h:commandButton id="add"
                                             value="Add User"
                                             action="adduser" />
                        </h:panelGroup>
</f:facet>

我在带有 Glassfish 5.1 的 Windows 10 上使用 Netbeans。

谢谢

解决方法

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

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

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