使用 wsdl2java 生成客户端代码后,为了便于实施人员和接口方进行测试,我写了一个 swing 的小程序,在 swing 中,一般耗时操作会使用 SwingUtilities.invokeLater
异步调用。实施人员在测试的时候总是出现一个从来没有遇到过的错误,WSDLServiceFactory 抛出空指针异常,对 3.0.0 版本的 cxf 来说,异常位于 WSDLServiceFactory.java:85:
definition = getBus().getExtension(WSDLManager.class).getDefinition(url);
由于从没遇到过这个异常,使用 Google 搜索多个结果后,看到一个解决方案(原文地址),在创建客户端代码前,先调用下面的代码设置 contextClassLoader :
Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
这是因为 CXF 2.4.0 版本以后处理 contextClassLoader 的方式不一样了。所以如果你遇到了这个问题,可以试试这种解决方案。