使用独立 jar 时正在发送 Apache CXF Soap1_1

Apache CXF Soap1_1 is being sended when using stand-alone jar

我有一些基本的独立 jar 应用程序,它发送带附件的签名 SOAP 请求。我使用 Apache CXF 生成了所有 类。 我遇到的问题很奇怪。当从 Eclipse 中 运行 时,一切正常,但是当导出 JAR 文件时,一切都停止了。 在深入研究 SOAP infra 之后,我发现问题是当我是 运行 独立 JAR 时,正在使用 SOAP 1.1(并且所有 messageImpl 等在运行时都是 1_1Impl),这导致了问题,但是当 运行 来自 Eclipse 时,正在使用 Soap 1.2 并且一切正常。

在这两种情况下,我都运行 Java。

这里是端口定义的部分代码。

URL wsdl = this.getClass().getClassLoader().getResource("myWsdl.wsdl");
MyService service = new MyService(wsdl);

port = service.getPort(MyServiceInterface.class);
BindingProvider bpPort = (BindingProvider)port;

List<Handler> handlerChain = bpPort.getBinding().getHandlerChain();
handlerChain.add(new SOAPLoggingHandler(true));
bpPort.getBinding().setHandlerChain(handlerChain);

bpPort.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, serverUrl);

InvocationHandler handler = Proxy.getInvocationHandler(port);

BindingProvider bp = (BindingProvider) handler;
SOAPBinding binding = (SOAPBinding) bp.getBinding();
binding.setMTOMEnabled(true);

什么会导致这种奇怪的行为?

谢谢

所以在对这个问题做了一些深入的逆向工程之后,我发现这个问题是因为

URL wsdl = this.getClass().getClassLoader().getResource("myWsdl.wsdl");

显然,当 运行 导出 jar 时,URL 将为空,这会强制 CXF 对所有 SOAP 实现使用默认值,即 SOAP1_1

在我的案例中,最简单的解决方法是将 wsdl 文件外部化到文件系统。