EJBException转换为SQLException

时间:2017-10-31 02:22:43

标签: java exception-handling ejb sqlexception

我在尝试构建从托管bean调用的泛型方法时遇到问题,并在视图中报告错误(最终用户)。

这是一个managedBean代码:

 public void processEntity() {
    try {
        //code save, update, delete or any process here!!! 
    } catch (Exception e) {
        errornotifier.notification("message for user", e);
    }
}

这是我的错误通知器代码:

public static void notification(String msj, Exception exep) {
    String sqlMsj = null;
    try {
        if (exep instanceof EJBException) {
            EJBException ejbException = (EJBException) exep;
            if (ejbException.getCausedByException().getCause() instanceof PersistenceException) {
                PersistenceException persistExep = (PersistenceException) ejbException.getCausedByException().getCause();
                Throwable throwable = persistExep;
                if (throwable instanceof SQLException) {
                    SQLException sqlex = (SQLException) throwable;
                    sqlMsj = ""; //-->validatios and set message agree sqlcode ...
                }
            }
        }
    } catch (Exception ex) {
       msj = msj + ex.getMessage();         
    }finally {
        FacesContext.getCurrentInstance().addMessage(null,new FacesMessage(FacesMessage.SEVERITY_INFO, "Executed", msj));
        logger.error("notification failed", msj);
    }
}

之前的代码在glassfish - payara服务器上正常工作但在weblogic中不起作用,因为此服务器上返回的错误是指EJBException的TransactionRolledbackLocalException的实例,我不能像我对PersistenceException那样执行相同操作的SQLException。

我使用jpa-hibernate处理数据的持久性,我只在Java编程了几个月,所以我希望你原谅我,如果我做错了,如果有更好的方法,请告诉我。

1 个答案:

答案 0 :(得分:0)

你是对的;由于当您使用应用程序服务器的JDBC池时,实际JDBC驱动程序顶部的专有层对您是隐藏的,因此您不应该对依赖于异常的方式进行硬编码。

假设您只是想找到底层的SQLException,如果有的话,您可以在异常链中继续前进。使用类似this one的方法。

public static SQLException getSQLException(Exception exep) {
    while (exep != null && !(exep instanceof SQLException)) {
        exep = exep.getCause();
    }
    return exep;
}