2017-01-12 3 views
1

Что-то не так в моем коде во время выполнения. Я реализовал клиент SOAP с помощью apache CXF. Я создал конечную точку через JaxWsProxyFactoryBean. Вот мой код:Apache CXF java.lang.StackOverflowError

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

Первый раз, когда я реализовал его, он работал хорошо, поэтому я решил сделать некоторые рефакторинга, (классы шаг заглушки в другом пакете, интерфейс API в другой и так далее ...) Когда я снова построил его и запустил, что-то случилось. Приложение не в состоянии с java.lang.StackOverflowError в api = (MYAPI) factory.create(); Вот это StackTrace:

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 

....

Может кто-нибудь помочь мне решить эту проблему? Я не знаю, в чем проблема. Я основал это, может быть, проблема использования JAVA 8 для сборки CXF, но я с версией 3.1.7, и я также пытался построить ее с помощью Java 7 (потому что у меня нет специфических реализаций Java 8), запустите ее и эта же проблема повторилась.

+0

Кажется круговой ссылкой. Не могли бы вы показать свою модель JAXB? – pedrofb

+0

Вы имеете в виду классы-заглушки с аннотациями JAXB? –

+0

Да. Кажется, что как-то класс берет себя рекурсивно – pedrofb

ответ

2

(разрешено в комментариях) Кажется, круговая ссылка, где класс JAXB заряжает себя, рекурсивно создавая переполнение стека.

Действия

вы переработан ли? Вернитесь назад и делайте это шаг за шагом. Если вы не можете, попробуйте обнаружить службу и классы, которые вызывают проблему, например удаление метода службы до тех пор, пока ошибка не будет поднята.

Решение (как прокомментировал @AleydinKaraimin)

CXF генерироваться 2 класса с тем же именем и первым имеет поле, сослаться на второй, но после рефакторинга Move в другом пакете, он стал ссылаться на себя и из-за логики реализации он загружает его снова и снова.