这些其他问题暗示了一个解决方案,但我还没有能够解决这个问题:
Could not resolve a binding for http://schemas.xmlsoap.org/wsdl/soap/
ServiceConstructionException when creating a CXF web service client
How to package an Apache CXF application into a monolithic JAR with the Maven "shade" plugin
当我通过java -Xdebug -jar myapp.jar
启动我的应用程序时,当应用程序进行SOAP调用时,我得到ServiceConstructionException: Could not resolve a binding for null
。当我在IntelliJ中启动应用程序时,应用程序和SOAP调用工作正常。以下是重现错误的最小示例:https://github.com/stianlagstad/mainclass-and-jxf-problems-demo
重现步骤:
- gradle clean build && java -Xdebug -jar build/libs/mainclass-and-jxf-problems-demo.jar
- 转到http://localhost:4242/endpoint/并查看错误
任何人都可以帮我弄清楚我必须做些哪些改变才能使SOAP调用工作?
编辑以提供更多信息:
如果我修改build.gradle
以不排除META-INF(即configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
而不是configurations.compile.collect { it.isDirectory() ? it : zipTree(it).matching{exclude{it.path.contains('META-INF')}} }
),我会收到此错误:Error: Could not find or load main class com.shadowjarcxfproblem.JettyLauncher
(在启动应用时一个罐子)。然而,在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
答案 0 :(得分:1)
在读完这两个并尝试了一堆不同的东西后,我终于偶然发现了一些有用的东西!
How to package an Apache CXF application into a monolithic JAR with the Maven "shade" plugin
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 shadowjar插件完成此任务解决了问题:
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'
}
}