2

我正在尝试在 NetBeans 7.0.1 中添加对我的应用程序的 Web 服务引用。Metro web 服务受 SSL 保护,并且托管在我要运行客户端的同一台计算机上。我正在使用“新建 Web 服务客户端”向导,但是当我提交受 SSL 保护的 WSDL 时,我收到以下错误消息:

下载 wsdl 或模式文件时出现问题。

检查 URL、代理设置或服务器是否正在运行。

网址:https ://192.168.0.200:8181/MyApp/myService?wsdl

Metro 用户指南 -保护示例 Web 服务客户端应用程序 (SSL)状态:

在指示您将希望客户端使用的 Web 服务的 URL 剪切并粘贴到 WSDL URL 字段的步骤中,键入 https://fully-qualified-hostname:8181 /CalculatorApplication/CalculatorWSService?wsdl(更改以粗体表示)表示此客户端应使用安全端口引用 Web 服务。首次访问此服务时,请在出现提示时接受证书 (s1as)。这是弹出的服务器证书,以向客户端确认其身份。

在某些情况下,您可能会收到一个错误对话框,告诉您 URL https:// fully-qualified-hostname :8181/CalculatorApplication/CalculatorWSService?wsdl 无法下载。但是,这是正确的 URL,它会在您运行服务时加载。因此,当发生此错误时,请重复使用安全 WSDL 创建 Web 服务客户端的步骤。第二次创建 Web 服务引用,您可以继续创建客户端。

无论我尝试多少次,我仍然会收到相同的错误消息(没有设置代理并且服务器正在运行部署的服务)。接受证书后,WSDL 会显示在浏览器中。如果我输入基本 WSDL URL(没有 HTTPS 的 URL),向导会接受它并生成客户端。我需要做什么才能完成这项工作?

更新

如果我在不同的机器上运行客户端和服务,这同样适用。我正在使用默认的开发证书。检索器输出:

错误:发生 I/O 错误。sun.security.validator.ValidatorException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径`

我必须在 VMargs 中设置密钥库和信任库吗?如果我想在包含 Web 服务的同一个 Web 应用程序中拥有此服务引用怎么办?

4

1 回答 1

2

在这里找到答案:

您必须使用以下选项运行 NetBeans:

<NETBEANS_HOME>/bin/netbeans.exe
-J-Djavax.net.ssl.trustStore=<AS_HOME>/domains/domain1/config/cacerts.jks 
-J-Djavax.net.ssl.keyStore=<AS_HOME>/domains/domain1/config/keystore.jks 
-J-Djavax.net.ssl.trustStorePassword=changeit 
-J-Djavax.net.ssl.keyStorePassword=changeit

我实际上将它们设置在<NETBEANS_HOME>/etc/netbeans.conf, in netbeans_default_options。我仍然得到一个错误,这只是导致我能够为受 SSL 保护的服务生成客户端代码。运行一个简单的 WS 调用会导致:

编辑重要提示仅当您使用较旧的 JAX-WS 库时才会发生以下情况!

线程“主”javax.xml.ws.WebServiceException 中的异常:找不到“https://localhost:8181/myApp/myService?wsdl”wsdl。将资源正确放置在类路径中。

这可以通过DATASTOREWS_WSDL_LOCATION使用如下方法设置 clients 属性来解决:

private static URL getURL() {
    try {
        return new URL("https://localhost:8181/myApp/myService?wsdl");
    } catch (MalformedURLException ex) {
        Logger.getLogger(DataStoreWS_Service.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}

仅当您为简单的 Java 应用程序生成它时才需要这样做,因为生成的客户端代码对于 Java Web 应用程序是不同的。此外,我只是无法使用完全限定的主机名,比如我的本地 IP。唯一有效的是本地主机。一件重要的事情:不要忘记捆绑与服务端相同的 Metro 库!注意错误报告

于 2011-09-29T09:33:31.113 回答