2017-10-31 12 views
0

管理対象Beanから呼び出され、ビュー(エンド・ユーザー)のエラーを報告する汎用メソッドを構築しようとすると、問題が発生します。SQLExceptionにキャストされるEJBException

このmanagedBeanコード:

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

これは私のerrornotifierコードです:

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の上で正しく動作します - ペーシュ・カショーロサーバが、エラーがで返さ以来のWebLogicでは動作しません。このサーバーはEJBExceptionのTransactionRolledbackLocalExceptionのインスタンスを参照し、SQLExceptionへのPersistenceExceptionの場合と同じようにキャストできません。

私はjpa-hibernateでデータの永続性を働かせています。私はJavaで数カ月間プログラミングしていましたので、もし私が間違っていると私が許してくれることを願っています。 。

+0

達成しようとしているものは何ですか? 'try'ブロック内のコードは無効です – ytg

+0

tryブロックでは、データベース内の永続性(挿入、更新、削除など)または必要なものに応じたjava文を実行できます。コードは正しく動作しますサーバーglassfishとpayaraではなく、weblogicで。 – fjrincon0

+0

私は理解していますが、Glassfishで実際に動作しているステートメントによっては、あなたの質問に対する答えが異なる場合があります。 – ytg

答えて

0

あなたはそうです。アプリケーションサーバーのJDBCプーリングを使用するときは、実際のJDBCドライバの上にある独自のレイヤーが隠されているため、例外がラップされる方法の依存関係をハードコーディングするべきではありません。

基礎となるSQLExceptionを見つけようとしているだけであれば、例外チェーンを構築することができます。 this oneのようなアプローチを使用します。

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

こんにちは、このテストはすでに行われ、しかしのWebLogicにSQLエラーがTransactionRolledbackLocalExceptionから返され、GlassFishのサーバーには十分である コード: 'しばらく(!!のSQLException instanceofはexep = NULL &&(exep)){ exep = exep.getCause(); 文字列msj = exep .getClass()。getCanonicalName(); // MSJ - > weblogic.transaction.internal.AppSetRollbackOnlyException } ' は、このログサーバ:どのようにキャストしますSQLExceptionへのSqlExceptionHelper – fjrincon0

関連する問題