質問: "データ登録失敗でした"; // ロールバックを宣言(?) // ---2 }else{ // 例外が想定外ならフレームワークに投げる throw new SystemException(e) } } // 以下正常処理 result.setAAA(message); return result; ``` 1の部分をどうしたらよいか・・・と考えています。 形にこだわってはいませんので、ORAコードを取得して、処理を続行できることを探しています。 その後は、2でロールバックを宣言できればとも考えていますが、まずは1の部分をと考えてます。 どうぞよろしくお願いいたします。 仕様 Terasoluna 2.0.2 Spring flamework 2.5 Strurs 1.2 ibatis 2.3 Oracle 11g JAVA 1.6
回答: SpringとiBatisの組み合わせで発生したSQL実行時例外は、以下のようにデータソース実行中の例外をtry~catchすることで判定できます。 接続するデータベースによってスローされる例外クラスが異なり、OracleDBの場合はSQLSyntaxErrorException以外にもその状況に応じて異なる例外がスローされます。 ``` public String findOne() { try { return repository.findOne(); } catch(Exception e) { SQLSyntaxErrorException ex = (SQLSyntaxErrorException)e.getCause(); int venderCode = ex.getErrorCode(); return null; } } ``` 例えば発行したSQLがSQLの文法エラーで、「ORA-00925: INTOキーワードがありません。」だった場合、上記の ex.getErrorCodeは925が返されます。 この例ではSQLを実行するrepository以下のコードに対して直接try~catchをしましたが、処理横断的に例外ハンドリングをする場合は、例外ハンドラを設けて共通化をされた方が良いでしょう。