Im Frühjahr MVC, wo Datenbankausnahmen abzufangen sind

8

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:

  1. 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?

  2. 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?

  3. 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%     
Amarsh 07.08.2013, 04:10
quelle

3 Antworten

1

Ausnahme tritt bei Service-Schicht auf. Sie können dies in der Ablaufverfolgung sehen

at com.sun.proxy.$Proxy26.addUser(Unknown Source)

%Vor%

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

    
ssk 07.08.2013 05:21
quelle
0

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?

    
gerrytan 07.08.2013 04:29
quelle
0

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önnen

3. 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.

    
denov 07.08.2013 05:24
quelle