阿帕奇 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.WhosebugError
在 api = (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 之后,它变成了引用自己,并且由于实现逻辑它反复加载。
我的代码在 运行 时出了点问题。我使用 apache CXF 实现了 SOAP 客户端。我通过 JaxWsProxyFactoryBean
创建了端点。这是我的代码:
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(MYAPI.class);
factory.setAddress(service);
api = (MYAPI) factory.create();
我第一次实现它时,它运行良好,所以我决定进行一些重构,(将存根 类 移到不同的包中,将 API 接口移到另一个包中,等等。 .) 当我再次构建它并 运行 它时,发生了一些错误。应用程序失败,java.lang.WhosebugError
在 api = (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 之后,它变成了引用自己,并且由于实现逻辑它反复加载。