Wir haben eine App auf App Engine und verwenden das Spring-Framework. Vor kurzem haben wir einige neue Funktionen hinzugefügt, die auf AOP basieren. Wir haben uns dafür entschieden, den @AspectJ-Stil zu verwenden, daher haben wir <aop:aspectj-autoproxy>
in unsere XML-basierte Konfiguration eingefügt und entsprechende Aspekte implementiert. Alles funktioniert auf dem Entwicklungsserver OK. Bei der Bereitstellung in der Cloud-Umgebung erhalten wir bei jeder Initialisierung der App java.lang.StackOverflowError
.
Die Bean, die nicht erstellt werden kann und den Fehler verursacht, ist die Konfigurationsklasse, die mit @Configuration
annotation versehen ist. Es scheint, dass im Grunde jede Konfigurations-Bean den Fehler verursachen kann.
Unten können Sie die entsprechende Stapelverfolgung sehen.
%Vor%Aktualisierung: Ich habe das Problem zusammen mit der Beispielanwendung, die das Problem veranschaulicht, in den App Engine-Problemverfolger gestellt. Bitte folgen Sie dem Link um Details zu sehen.
Ein Stapelüberlauf weist normalerweise auf eine Endlosschleife hin. Mit aspectj können Sie dies im folgenden Fall haben:
%Vor%Wenn Sie nun aspectj-Ausdrücke verwenden, die sagen: Ich möchte mein configServiceImpl protokollieren, dann haben Sie auch eine Endlosschleife, wenn Sie den configService verwenden:
Ich kann nicht erklären, warum es in Ihrem lokalen Setup funktioniert und nicht in der App-Engine. Oder warum ist es nur, wenn Sie @Configuration verwenden, aber ich denke, Sie sollten in der Richtung einer "zirkuläre Abhängigkeit" wie folgt aussehen.
Das liegt entweder an einer unendlichen Rekursion oder daran, dass Ihr Stack einfach zu groß ist. Versuchen Sie, Ihre Stack-Größe zu erhöhen, um zu sehen, ob das das Problem löst (z. B. -Xss1m
). Wenn das nicht hilft, können Sie eine unendliche Rekursion haben. Siehe auch:
Java-Stack-Überlauffehler - Wie erhöht man die Stackgröße in Eclipse?
Tags und Links java spring google-app-engine spring-aop