【问题标题】:Apache CXF java.lang.StackOverflowErrorApache CXF java.lang.StackOverflowError
【发布时间】:2017-01-12 07:28:03
【问题描述】:

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

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

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

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 特定的实现),运行它同样的问题又发生了。

【问题讨论】:

  • 似乎是一个循环引用。你能展示你的 JAXB 模型吗?
  • 你的意思是,带有 JAXB 注释的存根类?
  • 是的。似乎,一个类以某种方式递归地为自己充电
  • 他们太多了(超过 100 个),你能建议我,搜索什么。例如注释中的某些内容。我对 JAXB 不是很熟悉。 CXF为我做。感谢您的帮助
  • 你重构了吗?回去一步一步做。如果不能,则尝试检测导致问题的服务和类,例如删除服务方法,直到不引发错误。

标签: java apache web-services soap cxf


【解决方案1】:

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

操作

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

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

CXF 生成了 2 个具有相同名称的类,第一个具有引用第二个的字段,但是在另一个包中重构 Move 后,它变成了引用自身,并且由于实现逻辑它一次又一次地加载它。

【讨论】:

    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多