2017-01-12 2 views
1

In meinem Code läuft zur Laufzeit etwas schief. Ich habe SOAP-Client mit Apache CXF implementiert. Ich habe den Endpunkt über JaxWsProxyFactoryBean erstellt. Hier ist mein Code:Apache CXF java.lang.StackOverflowError

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); 
      factory.setServiceClass(MYAPI.class); 
      factory.setAddress(service); 
      api = (MYAPI) factory.create(); 

Zum ersten Mal, als ich es umgesetzt, es funktioniert gut, so habe ich beschlossen, einige Umgestaltung zu tun, (move Stub-Klassen in verschiedenen Paketen, API-Schnittstelle in einer anderen und so weiter ...) Wenn ich es wieder gebaut habe und es ausgeführt habe, passiert etwas falsch. Die Anwendung versagen die mit java.lang.StackOverflowError bei api = (MYAPI) factory.create(); Hier die stacktrace ist:

Thread [main] (Suspended (exception StackOverflowError))  
    ReflectionUtil.getDeclaredFields(Class<?>) line: 169  
    JAXBContextInitializer.walkReferences(Class<?>) line: 395 
    JAXBContextInitializer.addClass(Class<?>) line: 317 
    JAXBContextInitializer.addType(Type, boolean) line: 236 
    JAXBContextInitializer.addType(Type) line: 226 
    JAXBContextInitializer.walkReferences(Class<?>) line: 424 
    JAXBContextInitializer.addClass(Class<?>) line: 317 
    JAXBContextInitializer.addType(Type, boolean) line: 236 
    JAXBContextInitializer.addType(Type) line: 226 
    JAXBContextInitializer.walkReferences(Class<?>) line: 424 
    JAXBContextInitializer.addClass(Class<?>) line: 317 
    JAXBContextInitializer.addType(Type, boolean) line: 236 
    JAXBContextInitializer.addType(Type) line: 226 
    JAXBContextInitializer.walkReferences(Class<?>) line: 424 
    JAXBContextInitializer.addClass(Class<?>) line: 317 
    JAXBContextInitializer.addType(Type, boolean) line: 236 
    JAXBContextInitializer.addType(Type) line: 226 
    JAXBContextInitializer.walkReferences(Class<?>) line: 424 
    JAXBContextInitializer.addClass(Class<?>) line: 317 
    JAXBContextInitializer.addType(Type, boolean) line: 236 
    JAXBContextInitializer.addType(Type) line: 226 
    JAXBContextInitializer.walkReferences(Class<?>) line: 424 
    JAXBContextInitializer.addClass(Class<?>) line: 317 
    JAXBContextInitializer.addType(Type, boolean) line: 236 
    JAXBContextInitializer.addType(Type) line: 226 
    JAXBContextInitializer.walkReferences(Class<?>) line: 424 
    JAXBContextInitializer.addClass(Class<?>) line: 317 

....

Kann jemand mir helfen, dieses Problem zu lösen? Ich weiß nicht, was das Problem ist. Ich habe festgestellt, dass es ein Problem ist, JAVA 8 zu verwenden, um CXF zu erstellen, aber ich bin mit Version 3.1.7 und habe auch versucht, es mit Java 7 zu bauen (weil ich keine Java 8-spezifischen Implementierungen habe), führe es aus und das gleiche Problem ist erneut aufgetreten.

+0

Scheint eine Zirkularreferenz. Können Sie Ihr JAXB Modell zeigen? – pedrofb

+0

Meinst du, Stub-Klassen mit JAXB-Annotationen? –

+0

Ja. Es scheint so, als würde sich eine Klasse rekursiv aufladen – pedrofb

Antwort

2

(in Kommentaren gelöst) Es scheint eine zirkuläre Referenz zu sein, wo eine JAXB-Klasse sich rekursiv auflädt und einen Stapelüberlauf erzeugt.

Aktionen

Haben Sie Refactoring? Geh zurück und mach es Schritt für Schritt. Wenn dies nicht möglich ist, versuchen Sie, den Dienst und die Klassen zu ermitteln, die das Problem verursachen, z. B. das Entfernen der Dienstmethode, bis der Fehler nicht ausgelöst wird.

Lösung (als @AleydinKaraimin kommentiert)

CXF erzeugt 2 Klassen mit dem gleichen Namen und das erste hat Feld, das auf die zweite beziehen, aber nach in einem anderen Paket verschieben Refactoring, wurde es auf sich beziehen und wegen der Implementierungslogik wird es immer wieder geladen.