阿帕奇 CXF java.lang.StackOverflowError

Apache CXF java.lang.StackOverflowError

我的代码在 运行 时出了点问题。我使用 apache CXF 实现了 SOAP 客户端。我通过 JaxWsProxyFactoryBean 创建了端点。这是我的代码:

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

我第一次实现它时,它运行良好,所以我决定进行一些重构,(将存根 类 移到不同的包中,将 API 接口移到另一个包中,等等。 .) 当我再次构建它并 运行 它时,发生了一些错误。应用程序失败,java.lang.WhosebugErrorapi = (MYAPI) factory.create(); 这是 stackTrace:

Thread [main] (Suspended (exception WhosebugError))    
    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 个具体实现),运行 它和同样的问题再次发生。

(在评论中解决) 这似乎是一个循环引用,其中 JAXB class 正在递归地对自身充电,从而产生堆栈溢出。

操作数

你重构了吗?回去一步步做。如果不能,则尝试检测导致问题的服务和 classes,例如删除服务方法,直到不再出现错误。

解决方案(正如@AleydinKaraimin 评论的那样)

CXF 生成了 2 个同名的 classes,第一个有引用第二个的字段,但是在另一个包中重构 Move 之后,它变成了引用自己,并且由于实现逻辑它反复加载。