2017-01-28 7 views
0

私はSpring上のWebアプリケーションでHibernateを使用しています。 try catchブロックを使用してコントローラの私のメソッドとすべてが大丈夫です私はリダイレクトパラメータ "成功== true"を設定し、何かが間違っている場合、私は "エラー==真"を使用します。 これは機能します。しかし、時には私のコンソール休止状態で私はこのように、たとえば警告を示しています例外としてコンソールからHibernateログ

2017-01-28 19:13:44.253 WARN 4532 --- [nio-8080-exec-8] o.hibernate.util.JDBCExceptionReporter : SQL Error: 1062, SQLState: 23000 
2017-01-28 19:13:44.253 ERROR 4532 --- [nio-8080-exec-8] o.hibernate.util.JDBCExceptionReporter : Duplicate entry 
私はちょうど私がDBに新しいエントリを追加しようとするためのtry catchブロックでこれらの警告をキャッチしたい

- このケースで - エントリを複製try catchブロックですべてが受け入れられ、 "Operation succesfull"という情報が得られますが、そうではありません。 私はSQLException、HibernateException、一般的なExceptionのような異なる例外をキャッチしようとしました。しかし、それは動作しません。エントリの追加、更新、削除などの操作では、 'void'メソッドを使用するので、値を返すことはできません。

これらの警告/エラーをコンソールからキャッチする方法はありますか?ここで

@RequestMapping(value="/adduserdb", method=RequestMethod.POST) 
    public String addUserToDb(@ModelAttribute(value="userform") User user, RedirectAttributes redirectAttributes) { 
     try { 
      userService.createBasicUser(user); 
      redirectAttributes.addAttribute("success", true); 

      return "redirect:/admin/user/adduser"; 
     } catch(Exception e) { 
      redirectAttributes.addAttribute("error", true); 

      return "redirect:/admin/user/adduser"; 
     } 
    } 

は、私はそれを行う方法私の方法の一つの例ですが、それは仕事をdoesntの。

+0

実際に例外が発生していますか? 「キャッチしない」と「キャッチする」の違いがあります。たぶんuserServiceがそれを処理しますか? – Deltharis

答えて

0

休止状態の警告を表示しない場合は、休止状態のログレベルをinfoに設定できます。 XMLで

log4j.logger.org.hibernate=info 

その:あなたのapplication.propertiesで

は、これを追加し、これらのエラーを印刷

<logger name="org.hibernate"> 
    <level value="info"/> 
</logger> 
0

は、Hibernateのデフォルトの本質です。ログを非表示にするだけであれば、下のパッケージのログを無効にすることができます。春の起動時には

logger.level.org.hibernate.util=OFF 

などがありますが、これは他の関連するログが気付かれないことがあるため、これは推奨されません。

代わりに、挿入を実行する前にレコードがすでに存在するかどうかを確認することができます。そのため、エラー自体は必要ありません。

boolean isUserExist = userService.isUserExist(user.getName()); 
if(!isUserExist){ 
    userService.createBasicUser(user); 
    redirectAttributes.addAttribute("success", true) 
else { 
    redirectAttributes.addAttribute("error", true); 
    return "redirect:/admin/user/adduser"; 
} 

別のユーザーが両方のサービスコールの間で追加される可能性があるかもしれないが、これはこれは(可能性が低いと一般的なエラーメッセージを表示しますグローバル例外ハンドラを使用して特殊なケースとして扱うことができますアプリケーションによって異なります)

+0

これは私が欲しいものですが完全ではないものです。この場合、DBにユーザや他のオブジェクトが存在するかどうかをチェックする必要があります。 HibernateException - 何かが間違っていたときにHibernateExceptionをスローする - この場合でも重複したエントリであっても。問題は、私はこの例外をキャッチできないということです。私のDAOメソッドでは、 "HibernateExceptionをスローする"が使用されますが、コントローラではこの例外も一般的な "例外"がこれをキャッチしません。これは私の本当の問題です。 – Carath

+0

あなたは 'exception.getClass()'を印刷することで、Exceptionの正確なクラスを見つけて、それをキャッチするようにコードを修正することができます。しかし、この例外は実際の例外のラッパーになります。try catchを使用しても、Springのトランザクション性(ロールバック可能)に大きく依存していますが、それは良い方法ではありません。 –