java - 获取 CXF 错误 : javax. xml.ws.WebServiceException:WSDL 元数据无法用于创建代理

标签 java web-services soap wsdl cxf

我使用 CXF 的 wsdl2java 从 WSDL 文件生成代码。然后,我使用 ant 构建 xml 文件(也是由 CXF 的 wsdl2java 生成)构建代码。

当我在本地 Java 7 计算机上运行代码时,一切正常。当我在运行 Java 1.5 的云中的 Linux 机器上运行代码时,出现以下错误:

javax.xml.ws.WebServiceException: WSDL Metadata not available to create the proxy,
either Service instance or ServiceEndpointInterface com.a.b.TheService should have
WSDL information

我进行了搜索,但找不到任何可以解释我的场景中的错误的信息。我不知道从哪里开始处理这个问题。任何人都可以阐明吗?

我在上面提到了 Java 版本,因为这是一个明显的差异,但它可能与问题无关。

更新:根据 Syon 的请求添加以下代码:

private static final String servicesNamespace = "http://www.serviceprovider.com/services/2009/03/02";
private static final String servicesNamespaceSchema = "http://www.serviceprovider.com/services/2009/03/02/schema";
private static String SERVICE_NAME = "TheService";
private QName SERVICE_QNAME;
private TheService m_theService;
...

SERVICE_QNAME = new QName(servicesNamespace, SERVICE_NAME);

I wrote this code quite some time ago, and at the time I wrote the comment below.
I've included it here in case it is helpful:

// The sample code creates an instance of the generated TheService_Service class.
// TheService_Service has references to the local WSDL file that it was generated from, and
// will report an error if it is not found. To prevent that error, we could:
// (1) ensure that the WSDL is available locally in the production environment in the location
//     referenced in the generated Java
// (2) generate the Java from the WSDL located on the web rather than local WSDL, meaning that
//     the WSDL referenced in the generated Java would be a URL to where it is located on
//     serviceproviders's web site.
// (3) Rather than create an instance of TheService_Service, just create an instance of its
//     super class, javax.xml.ws.Service, which has a static method to create an instance of it that
//     does not require the location of the WSDL to be passed to it.
// I am going to choose option (3). Option (2) is a close second.

Service service = Service.create(SERVICE_QNAME);
m_theService = service.getPort(TheService.class);   <-- Fails here

((BindingProvider)m_theService).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointAddress);

Binding binding = ((BindingProvider)m_theService).getBinding();
((SOAPBinding)binding).setMTOMEnabled(false);

谢谢

保罗

最佳答案

据我所知,JAX-WS/CXF 始终需要 WSDL。是否您的 WSDL 包含在本地计算机上某处的类路径中,但不在 Linux 机器上?

无论如何,您应该能够使用 Service.create(URL, QNAME) 方法解决此问题。 URL 需要指向 WSDL,您可以使用 Web 服务端点 + 最后的 ?wsdl,或者在本地保存 WSDL 的副本并指向该副本。

在您的评论中,您提到最好引用网络上的 WSDL。就我个人而言,我会将其存储在本地,因为这将提高调用 Web 服务时的性能。每次创建代理时,框架不需要通过网络进行调用来获取 WSDL。

关于java - 获取 CXF 错误 : javax. xml.ws.WebServiceException:WSDL 元数据无法用于创建代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17839949/

相关文章:

c# - 用 C# 解析和查询 SOAP

java - 生成的Web服务未接收参数

asp.net - 增加 IIS7 中 Web 服务的最大并发连接数(负载测试)

web-services - 国庆节网络服务

java - Rails 3 中的路由错误

java - Java 9 需要 Spring 5 吗?

web-services - 关于 OAuth 2.0 : Are 3rd Party Cookies Enabled a dependency?

java - 通过 Java 给出准备好的 SOAP 响应

java - Spring JDBC 中 Hibernate 模型的等价物是什么

java - 如何从另一个类通知RecyclerView的DataSetChanged?