在我们的应用程序中,我们进行WSDL服务调用(让我们说“SomeService”)。我们在我们的环境中使用JBoss 6.x和JDK1.8(测试)。我们的应用程序还依赖于CXF来处理其他一些服务。应该通过标准JAXWS而不是“CXF”来调用“SomeService”。默认情况下,c all通过CXF路由,这导致了策略问题。因此,我遵循了下面提到的解决方案:
JAX-WS = When Apache CXF is installed it "steals" default JDK JAX-WS implementation, how to solve?。
我在代码中做了以下更改:
if (previousDelegate.getClass().getName().contains("cxf")) {
ServiceDelegate serviceDelegate = ((Provider) Class.forName("com.sun.xml.internal.ws.spi.ProviderImpl").newInstance())
.createServiceDelegate(SomeService.WSDL_LOCATION, SomeService.SERVICE_NAME, service.getClass());
delegateField.set(service, serviceDelegate);
}
此更改在我的本地环境中正常工作(我正在使用Tomcat 8 + JDK 1.8)。我去测试平台部署代码(它是JBoss 6.x + JDK 1.8)。在测试功能时,我收到以下错误:
java.lang.ClassNotFoundException: com.sun.xml.internal.ws.spi.ProviderImpl from [Module "deployment.MyAPP.war:main" from Service Module Loader]
不确定此错误的原因。有人有线索吗?我们是否需要在JBoss服务器中进行任何其他更改。由于“com.sun.xml.internal.ws.spi.ProviderImpl”是标准类,并且在JDK1.8中可用,因此我没有看到任何理由因为我们的JBoss服务器指向JDK1而导致上述错误。 8。
非常感谢您的帮助。
答案 0 :(得分:0)
它看起来像是您的应用程序或应用程序服务器的类加载问题。
ClassNotFoundException将在第一次引用类并且类加载器尝试加载它时发生。下次引用类时,类加载器已缓存,但未找到,并将抛出NoClassDefFoundError。
确认ClassNotFoundException不是由未正确打包的类或其他类加载器设置引起的。另外,确保在第一次引用类时没有发生ClassNotFoundException。
检查JBoss路径中是否有符号链接。 这将告诉我们您已部署到您的应用程序的类,并允许我们检查是否部署了com.sun.xml.internal.ws.spi.ProviderImpl或相关类。该类随应用程序服务器一起提供在此目录中,我认为这应该是它从中加载的唯一位置。
的src / JBoss的-AS /第三方/太阳JAXWS / LIB / JAXWS-rt.jar中
我可以找到的消息“classLoader没有连接到某个域(可能已取消部署?)的类”
如果您正在使用自定义JAX-WS实现并且不想使用JBossWS CXF(EAP 6.x附带的受支持的JAX-WS库),则需要先从中删除JBossWS您的部署
完成后,您需要公开代表JAX-WS和SAAJ实现的JDK类。
确保将sun.internal.saaj和sun.internal.ws的模块依赖项添加到部署中。
-
阿努普