2016-07-13 4 views
2

Ich habe eine Spring-Boot-Anwendung, in der ich die Tabellen basierend auf einigen Konfigurationen initialisieren muss. Ich verwende verwaltete Transaktionen mit @Transactional. Mein Problem ist, dass ich nicht weiß, wann App bereit ist, DB-Transaktionen zu machen. Ich habe eine Bohne, die die Konfiguration liest und aktualisiert die Tabellen, aber es wird eine Ausnahme an diesem Punkt:Initialisierungs-Tabellen beim Start des Spring-Bootes

Could not obtain transaction-synchronized Session for current thread

ich versucht habe, wenn ich sprintboot warten zu starten und die gleichen Transaktionen über HTTP-Anfragen zu machen , dann gibt es kein Problem. Es scheint also ein Timing-Problem zu sein. Ich habe auch versucht, den Code auf von Bean zu verschieben, aber es behebt das Problem nicht.

Woher weiß ich, dass die App für DB-Transaktionen bereit ist? Jede Hilfe wird sehr geschätzt.

Antwort

1

Die einfachste und sauberste Weg, um die Initialisierung durchzuführen, indem Sie Ihre Bohne ApplicationListener für ContextRefreshedEvent implementieren sein sollte und dann die Initialisierung in dem Verfahren onApplicationEvent Handhabung. Auf diese Weise wird Ihre Initialisierung ausgeführt, wenn der gesamte Anwendungskontext von Spring initialisiert wird.

+1

Danke für den Hinweis. Ich habe tatsächlich die Annotation @EventListener verwendet, die ab Frühjahr 4.2 verfügbar ist. – Aarkan

+0

Noch besser! :) –

2

Sie können auf einige Ereignisse hören, die Frühling veröffentlicht. Siehe here

Sie properbly auf diese auch hören müssen: ContextRefreshedEvent