Log4J - Detaillierte Logeinträge

fsicher

Bekanntes Mitglied
Hallo allerseits

Während der Testphase habe ich eine ConstraintViolationException gezielt hervorgerufen: Ich versuche ein neues Objekt anzulegen, dessen Eigenschaft title einen schon vergebenen Wert bekommen soll. Diese Eigenschaft muss aber eindeutig (unique) sein. Der Versuch wird eben mit der ConstraintViaolationException quitteirt.

Mein Problem ist aber, dass ich im StackTrace nur sehe, dass ein Constraint verletzt wurde: keine weiteren Details sind zu sehen. Die Exception-Aufbau sieht wie folgt aus:


e (javax.persistence.RollbackException)
¦
-- cause (javax.persistence.PersistenceException)
¦​
-- cause (org.hibernate.exception.ConstraintViolationException)​
¦​
-- cause (java.sql.BatchUpdateException)​

In der Logdatei sieht der letzte StackTrace-Teil wie folgt aus:

[XML]

...

Caused by: java.sql.BatchUpdateException: Batch-Eintrag 0 insert into Room (seats, title, id) values (120, big_room, 54) wurde abgebrochen. Rufen Sie 'getNextException' auf, um die Ursache zu erfahren.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchResultHandler.handleError(AbstractJdbc2Statement.java:2533)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1316)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:349)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeBatch(AbstractJdbc2Statement.java:2670)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
[/XML]

Wenn ich auf BatchUpdateException die Methode getNextException aufrufe, bekomme ich eine klare Erklärung, worin das Problem bestand! Nun frage ich mich aber, wie ich dies in die Logdatei bekomme! Denn, ich kann diese Methode erst auf der BatchUpdateException aufrufen, die wiederum in anderen Ausnahmen eingebettet ist. Und, wie tief sie eingebettet wurde, kann ich nicht zum Voraus sagen. Ergo müsste ich rekursiv nach diesem Ausnahme-Typ suchen und wenn ich es gefunden habe, die Methode "getNextException" aufrufen. Das würde aber den Code sehr belasten ...

Das Abfangen der Ausnahme und die Protokollierung habe ich zurzeit wie folgt gemacht:

Java:
catch (Exception e) {
	logger.error("Error during creation: ", e);
	
	// ... 
	
	throw new RuntimeException(e);
}

Gibt es einen anderen Weg, um die "getNextException" aufzurufen und eine detailliertere Problembeschreibung in der Logdatei zu bekommen?

Danke.
 
getCause() liefert warscheinlich das gleiche und gibt es in jeder exception
 
Habe ich auch getestet, allerdings ohne Erfolg. Evtl. mache ich doch etwas falsch 🙁

Wenn ich die Referentielle Integrität verletze, bekomme ich eine genaue Problembeschreibung. Ich habe die beiden StackTraces verglichen und der Einzige Unterschied ist die letzte Exception im StackTrace (an sich die erste, die geworfen wird). Anstatt java.sql.BatchUpdateException habe ich in diesem Fall die org.postgresql.util.PSQLException. Der letzte StackTrace-Teil sieht wie folgt aus:

[XML]
...

Caused by: org.postgresql.util.PSQLException: FEHLER: Aktualisieren oder Löschen in Tabelle »person« verletzt Fremdschlüssel-Constraint »fk6f249bd171c20dd7« von Tabelle »abteilung«
Detail: Auf Schlüssel (id)=(15) wird noch aus Tabelle »abteilung« verwiesen.
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1547)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1315)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:190)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement.java:304)
at org.hibernate.hql.ast.exec.BasicExecutor.execute(BasicExecutor.java:101)
... 42 more


[/XML]

Habe noch einmal die Ausnahmebehandlung und die Weitergabe der Ausnahme im Code kontrolliert und verglichen: einen nennenswerten Unterschied habe ich nicht gefunden.

In der API habe ich gesehen, dass die beiden Exceptions schlussendlich von java.sql.SQLException abgeleitet sind: diese Exception-Klasse stellt die Methode getNextException zur Verfügung. Wieso diese (offenbar) einmal aufgerufen wird und einmal nicht?

// Referentielle Integrität - Logeintrag OK

javax.persistence.PersistenceException
¦​
-- org.hibernate.exception.ConstraintViolationException​
¦​
-- org.postgresql.util.PSQLException (siehe Auszug aus StackTrace)​


// RollbackException - Logeintrag NOK

javax.persistence.RollbackException
¦
-- javax.persistence.PersistenceException
¦
-- org.hibernate.exception.ConstraintViolationException
¦
-- java.sql.BatchUpdateException (Rufen Sie 'getNextException' auf, um die Ursache zu erfahren.)​


Obwohl im zweiten Fall die RollbackException am Anfang steht, verstehe ich das unterschiedliche Verhalten trotzdem nicht. Vielleicht kann mich jemand aufklären.

Danke.
 

Zurück
Oben