Ich folge der oben vorgeschlagenen Struktur ( Ссылка ). Ich habe versucht, einen doppelten Eintrag hinzuzufügen, der zu der folgenden Ausnahme geführt hat:
%Vor%Ich habe folgende Fragen:
Warum wird die Ausnahme vom Controller ( userService.addUser(user)
in com.bilitutor.cct.control.HomeController
) und nicht vom DAO ( sessionFactory.getCurrentSession().save(user);
) abgefangen und dann zum Controller geleitet?
Ich verstehe, dass ich eine org.springframework.dao.DataIntegrityViolationException
bekomme, weil ich die @Repository
-Anmerkung verwende, die vielleicht eine Ausnahmeübersetzung macht (korrigiere mich, wenn ich falsch liege). In diesem Fall, wenn ich die Ausnahme abfange, wie finde ich den Fehlercode dafür?
Wie empfiehlt es sich, auf welcher Ebene (DAO, Service oder Controller) die Ausnahme am besten zu erfassen?
Relevante Klassen:
Kontrolleur:
%Vor%Service:
%Vor%DAO:
%Vor%Ausnahme tritt bei Service-Schicht auf. Sie können dies in der Ablaufverfolgung sehen
at com.sun.proxy.$Proxy26.addUser(Unknown Source)
Da die vorherige Antwort besagt, dass Ihre Transaktionsgrenze auf der Serviceebene liegt, tritt dort eine Ausnahme auf.
Ich würde empfehlen, korrekte Geschäftsausnahmen (geprüfte Ausnahmen) von den Dienstmethoden zu entfernen. Servicemethoden beinhalten Ihre Geschäftslogik. Wenn etwas schief läuft, sollte es durch die Ausnahmen, die Servicemethoden auslösen, korrekt an die Außenwelt übermittelt werden. Für zB: WeakPasswordException, UserNameExistsException usw.
Betreffend org.springframework.dao.DataIntegrityViolationException
versuche, anzurufen
getCause()
, um die umbrochene Ausnahme zu sehen
1.
Ich vermute, dass Sie Ihre Controller-Handler-Methode als Transaktionsgrenze verwenden, z. B. so:
%Vor%Duplizierte Zeilen können nur erkannt werden, wenn das Update in die Datenbank synchronisiert wurde. Dies geschieht häufig beim Schließen der Transaktion, wenn Sie hibernate / jpa verwenden. Daher sehen Sie, als käme es von Ihrem Controller
Denken Sie daran, dass @Transactional
von jdk proxy / aspect weben funktioniert.
3.
Die Antwort hängt von Ihren Geschäftsanforderungen ab. Was müssen Sie tun, wenn eine bestimmte Ausnahme auftritt?
1. Ich glaube, dass die Ausnahme im Controller gefangen wird, da UserDAO.addUser () die Transaktionsgrenze ist.
2. DataIntegrityViolationException erweitert NestedRuntimeException , damit Sie getMessage, getMostSpecificCause, getRootCause
verwenden können3. In Ihrem Fall oben sollten Sie die Ausnahme in Ihrem Controller abfangen. Sie möchten Ausnahmen auf der Ebene abfangen, mit denen Sie umgehen können. Soweit Beispiel, wenn ich eine DAO-Methode geschrieben habe, um eine Liste von Objekten zu erhalten. Ich würde wahrscheinlich nach der Ausnahme in der DAO suchen und eine leere Liste zurückgeben und den Fehler gegen die Ausnahme protokollieren.
Tags und Links exception-handling hibernate spring-mvc