【问题标题】:"javax.xml.ws.WebServiceException: is not a valid service." proxy issue?“javax.xml.ws.WebServiceException:不是有效的服务。”代理问题?
【发布时间】:2014-04-23 11:30:12
【问题描述】:

作为前提,我还不是很有经验,但我已经尝试阅读和搜索所有可能与该主题相关的内容,但仍然没有运气。

我得到了一个简单的客户端来调用 Web 服务,但是一旦它完全设置好(包括使用证书和要设置的更多属性),我得到了标题中提到的错误:

javax.xml.ws.WebServiceException: {http://http://cert.controller.portaapplicativa.ictechnology.it//}MyService is not a valid service. Valid services are: 
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:187)
    at com.sun.xml.ws.client.WSServiceDelegate.<init>(WSServiceDelegate.java:159)
    at com.sun.xml.ws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:82)
    at javax.xml.ws.Service.<init>(Service.java:56)
    at package.client.wsimport.MyService..<init>(MyService.java:46)
    at package.client.Client.doRicercaDEN(Client.java:55)
    at package.client.Client.main(Client.java:36)

我尝试使用 JAX-WS 再次生成客户端:

java -classpath C:\Programmi\Java\jdk1.6.0_38\lib\tools.jar com.sun.tools.internal.ws.WsImport -verbose C:\WsdlFile.wsdl -p package.client.wsimport -s C:\tmp\ws\

我也遇到了同样的问题。我正在使用 wsdl 的本地副本,因为 wsimport 似乎不喜欢我试图在属性中设置的证书(我很可能做错了什么,但我选择了简单的解决方法,因为我有更多紧迫的问题)。

尝试使用 SoapUI 测试服务,一切正常,但我需要将代理的首选项设置为“无”。

所以我尝试确保连接也没有在我的客户端中使用任何代理:

(...)
systemSettings.remove("http.proxyHost");
systemSettings.remove("http.proxyPort");
systemSettings.remove("https.proxyHost");
systemSettings.remove("https.proxyPort");
System.setProperty("http.nonProxyHosts","*");
System.setProperty("https.nonProxyHosts","*");

(顺便说一句,在“*”之前,据我了解,它应该作为“每个域”的通配符,我也尝试过指定特定域) 不管怎样,结果总是一样的。

我做错了什么,还有什么要尝试的吗?

【问题讨论】:

    标签: java web-services https proxy wsimport


    【解决方案1】:

    我怀疑这是代理问题。如果您可以共享用于创建服务对象的代码,它可能会有所帮助。
    作为开始尝试阅读以下线程
    Is not a valid service exception in JAX-WS
    我认为您在创建服务时提供的 QName 不正确。要获得正确的 QName,您可以尝试打开生成的存根。

    【讨论】:

    • 我编辑了问题以显示我是如何创建客户端的。至于QName:public MyService() { super(MYSERVICE_WSDL_LOCATION, new QName("http://namespace.it/", "MyService")); }MYSERVICE_WSDL_LOCATION 是实际的wsdl URL,MyService 来自&lt;service name="MyService"&gt; namespace.it 来自&lt;definitions [...] targetNamespace="http://cert.controller.portaApplicativa.ictechnology.it/"&gt;&lt;xsd:schema&gt; &lt;xsd:import namespace="http://cert.controller.portaApplicativa.ictechnology.it/" schemaLocation="PortaApplicativaXsd.xsd"&gt;&lt;/xsd:import&gt; &lt;/xsd:schema&gt;
    • 呃,我实际上是,我打算更改所有实际的命名空间、服务名称等,因为我不知道我可以或不能公开什么,我错过了那个。在这一点上,让我在我的问题中改变它,对混乱感到抱歉。 (忘了我不能编辑评论,而是)
    • 我试图验证我在客户端的其余部分没有搞砸任何事情,并以webservicex.net/globalweather.asmx?WSDL 为例,我更改了我的 MYSERVICE_WSDL_LOCATION、命名空间和服务名称(加上设置代理属性),并且它按预期工作(然后在下一条指令处停止工作,再次按预期停止工作,因为我保留了其余代码,并且它试图获取新 ws 上不存在的端口)。此时,如果不是代理并且命名空间是正确的,我唯一剩下的猜测就是我没有正确读取 wsdl。
    • 事实证明,我缺少的是在我的本地信任库中导入证书(或者更好的是,当我第一次尝试这样做时,我以为我使用了正确的信任库,但我没有)。对于任何可能需要它的人,这里解释了如何使用 keytool 来做到这一点:javarevisited.blogspot.it/2012/03/… 另一种选择是使用特定的 GUI,如 Portecle。
    【解决方案2】:

    事实证明,我缺少的是在我的本地信任库中导入证书(或者更好的是,当我第一次尝试这样做时,我以为我使用了正确的信任库,但我没有)。

    对于任何可能需要它的人,这里解释了如何使用 keytool 来做到这一点:http://javarevisited.blogspot.it/2012/03/add-list-certficates-java-keystore.html

    另一种选择是使用特定的 GUI,例如 Portecle。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      相关资源
      最近更新 更多