当前位置: 首页 > 知识库问答 >
问题:

创建CXF web服务客户端(scala java wsdl2java)时的ServiceConstructionException

方安怡
2023-03-14

这些其他问题暗示了一个解决方案,但我一直无法实现这一点:
无法解析的绑定http://schemas.xmlsoap.org/wsdl/soap/
ServiceConstructionException在创建CXF web服务客户端时
如何使用Maven“shade”插件将Apache CXF应用程序打包到单片JAR中

当我通过执行java-Xdebug-jarmyapp.jar启动我的应用程序时,我会得到一个ServiceConstructionExc0019:当应用程序进行SOAP调用时,无法解决空的绑定。当我在IntelliJ中启动应用程序时,应用程序和SOAP调用工作正常。下面是一个重现错误的最小示例:https://github.com/stianlagstad/mainclass-and-jxf-problems-demo

复制步骤:
-gradle clean build

有人能帮我弄清楚我必须做哪些改变才能让SOAP调用正常工作吗?

编辑以提供更多信息:

如果我编辑build。gradle不排除META-INF(即拥有configurations.compile.collect{it.isDirectory()?it:zipTree(it)}而不是配置。编写collect{it.isDirectory()?it:zipTree(it)。匹配{exclude{it.path.contains('META-INF')}}}})我得到了这个错误:错误:无法找到或加载主类com。阴影问题。JettyLancher(以jar启动应用程序时)。然而,在IntelliJ中启动应用程序仍然有效,SOAP调用也同样有效。

cxf错误的堆栈跟踪:

org.apache.cxf.service.factory.ServiceConstructionException: Could not resolve a binding for null
    at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createBindingInfo(AbstractWSDLBasedEndpointFactory.java:352)
    at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpointInfo(AbstractWSDLBasedEndpointFactory.java:259)
    at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createEndpoint(AbstractWSDLBasedEndpointFactory.java:144)
    at org.apache.cxf.frontend.ClientFactoryBean.create(ClientFactoryBean.java:91)
    at org.apache.cxf.frontend.ClientProxyFactoryBean.create(ClientProxyFactoryBean.java:157)
    at org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create(JaxWsProxyFactoryBean.java:142)
    at com.shadowjarcxfproblem.SoapServiceFactory.create(SoapServiceFactory.java:36)
    at com.shadowjarcxfproblem.service.CalculatorServiceComponent$CalculatorServiceImpl.<init>(CalculatorService.scala:17)
...
Caused by: org.apache.cxf.BusException: No binding factory for namespace http://schemas.xmlsoap.org/soap/ registered.
    at org.apache.cxf.bus.managers.BindingFactoryManagerImpl.getBindingFactory(BindingFactoryManagerImpl.java:93)
    at org.apache.cxf.frontend.AbstractWSDLBasedEndpointFactory.createBindingInfo(AbstractWSDLBasedEndpointFactory.java:339)
    ... 75 more

共有1个答案

邹开畅
2023-03-14

在阅读了这两篇文章并尝试了一系列不同的东西之后,我终于发现了一些有用的东西
如何使用Maven“shade”插件将Apache CXF应用程序打包到单片JAR中
https://discuss.gradle.org/t/how-do-i-use-the-gradle-shadow-plugin-to-merge-spring-handlers-and-spring-schemas-files-of-multiple-spring-jar-dependencies/6713/6

在这个任务中使用gradle阴影罐插件解决了这个问题:

import com.github.jengelman.gradle.plugins.shadow.transformers.ServiceFileTransformer
shadowJar {
    // Make sure the cxf service files are handled correctly so that the SOAP services work.
    // Ref https://stackoverflow.com/questions/45005287/serviceconstructionexception-when-creating-a-cxf-web-service-client-scalajava
    transform(ServiceFileTransformer) {
        path = 'META-INF/cxf'
        include 'bus-extensions.txt'
    }
}
 类似资料:
  • 我是java和web服务以及的新手。我最近使用一些教程创建了一个web服务。当我第一次学习eclipse教程时,让我创建一个客户机。但是当我尝试创建一个新项目和一个新的web服务客户机时,它会给出。具体如下所示: im使用Axis2-1.6.1,它说java遵从性级别是6,我搜索了一下,但是找不到解决这个问题的相关方案。感谢任何帮助。

  • 问题内容: 这是一个设计问题。我有需要进入HTML表的数据,稍后将由用户操纵。基本上,用户将能够选择表格行中的项目。 我有两个选择-在两种情况下,我都使用AJAX来获取数据: 在服务器端使用PHP创建HTML代码,并将其作为HTML发送到客户端。然后,用户使用Javascript(本质上是jQuery)来操纵表格。 使用JSON将原始数据发送到客户端,然后使用jQuery创建HTML,然后由用户对

  • 关于Netflix Eureka Service Registry,我已经成功地使用Tomcat8.0.35设置了Eureka Netflix服务器。我还得到了基本的示例服务&客户端来进行相互通信。我对Eureka还是个新手,管理层决定将Eureka与Spring一起使用,因为几个新的应用程序都是围绕Spring框架编写的。 null 我希望为大多数非AWS云实例配置服务和客户端。Eureka W

  • 创建客户端有两种方式,一种是直接使用特化的构造器函数,另一种是使用工厂构造器函数。 第一种方式返回的是具体的客户端结构体指针对象,第二种方式返回的是客户端接口对象。 使用特化的构造器函数创建客户端 特化的构造器函数有下面几个: func NewHTTPClient(uri ...string) (client *HTTPClient) func NewTCPClient(uri ...string

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • NewTLSServer创建的服务器可以验证对显式从其创建的客户端的调用: 在行中。 但是,我有一个生产程序,我想将其设置为使用作为主机。我越来越 我称之为错误。 我如何设置与客户端进行身份验证,就像普通的HTTPS服务器一样?