2017-01-28 1 views
0

Ich verwende Hibernate in meiner Webanwendung auf Spring. Meine Methoden im Controller mit try catch block und wenn alles in Ordnung ist, setze ich redirect Parameter "success == true" und wenn etwas schief gelaufen ist, benutze ich "error == true". Es funktioniert. Aber manchmal in meiner Konsole Hibernate zeigt Warnung mich zum Beispiel wie folgt aus:Ruhezustandsprotokolle von der Konsole als Ausnahmen

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 

Ich möchte nur diese Warnungen fangen in Block try fangen, weil, wenn ich versuche neuen Eintrag DB hinzufügen mit - in diesem Fall - doppelte Eintrag dann in try catch block wird alles akzeptiert und ich habe die Information "Operation succesfull" bekommen, aber es ist nicht. Ich habe versucht, verschiedene Ausnahmen wie SQLException, HibernateException, auch allgemein zu fangen - Ausnahme. Aber es funktioniert nicht. Für Operationen wie Hinzufügen, Aktualisieren, Löschen von Einträgen verwende ich 'void' Methoden, so kann ich keinen Wert zurückgeben.

Kann man diese Warnungen/Fehler von der Konsole abfangen und wie?

@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"; 
     } 
    } 

Hier ist Beispiel für eine meiner Methoden, wie ich das tun, aber es funktioniert nicht.

+0

Sind Sie sicher, dass die Ausnahme tatsächlich ausgelöst wird? Es würde einen Unterschied zwischen "Fangen nicht fangen" und "nichts zu fangen" geben. Vielleicht handhabt userService es? – Deltharis

Antwort

0

Wenn Sie keine Ruhezustandswarnungen wünschen, können Sie die Protokollierungsstufe von Hibernate auf info einstellen. diese

in Ihrem application.properties hinzufügen:

log4j.logger.org.hibernate=info 

in xml seine:

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

diese Fehler Drucken sind Standard Art von Hibernate. Wenn Sie die Protokolle nur ausblenden möchten, können Sie Protokolle für das folgende Paket deaktivieren. Im Frühjahr Boot wäre das wie

logger.level.org.hibernate.util=OFF 

Allerdings ist dies nicht ratsam, da andere relevante Protokolle möglicherweise unbemerkt bleiben.

In Ihrem Fall können Sie überprüfen, ob der Datensatz bereits vorhanden ist, bevor Sie die Einfügung vornehmen, und so den Fehler selbst vermeiden.

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"; 
} 

Zwar gibt es eine Chance, dass ein anderer Benutzer zwischen den beiden Service-Anrufe hinzugefügt wird, kann dies als Sonderfall behandelt werden, um eine globale Exception-Handler verwenden, die eine generische Fehlermeldung zeigen würde, da dies weniger wahrscheinlich ist (abhängig von der Anwendung)

+0

Das ist etwas, was ich will, aber nicht komplett. In diesem Fall muss ich immer überprüfen, ob ein Benutzer oder ein anderes Objekt in der DB existiert, was meine nächste SQL-Abfrage zu db bedeutet. Hibernate immer, wenn etwas schief gelaufen ist, werfen HibernateException - auch in diesem Fall mit doppelten Eintrag. Problem ist, dass ich diese Ausnahme nicht verstehen kann. Meine DAO-Methoden verwenden: "löst HibernateException", aber im Controller diese Ausnahme nicht einmal allgemeine "Ausnahme" nicht erfassen. Das ist mein wirkliches Problem. – Carath

+0

Sie können die genaue Klasse der Ausnahme finden, indem Sie 'exception.getClass()' drucken, und dann Ihren Code ändern, um das zu erfassen. aber diese Ausnahme wird ein Wrapper der tatsächlichen Ausnahme sein .. auch mit Versuch fangen, Sie sind stark auf transaktionalen Frühling (Fähigkeit zum Rollback) angewiesen, aber das ist keine gute Praxis. –

Verwandte Themen