【问题标题】:Java web services client unable to access weather services from cdyne.comJava Web 服务客户端无法从 cdyne.com 访问天气服务
【发布时间】:2014-03-26 12:19:38
【问题描述】:

我正在学习如何用 Java 实现 Web 服务。按照 O'Reilly 的“学习 Java”一书中的示例,我在 cdyne.com 下载了一个气象服务的 WSDL 文件(参见 http://bit.ly/13moiTh),并使用 wsimport 工具生成了一组类。

第一个问题是,当我生成一个 JAR 文件并在 Eclipse 项目中引用它时,无法识别这些类。我必须使用 wsimport -keep 并将所有源文件单独复制到项目中才能构建。

接下来,为了确保服务可用,我根据书中的代码构建了一个简单的 HTTP POST 客户端。我可以使用该代码成功访问 getCityWeatherByZIP 服务,因此不存在连接或身份验证问题。

最后,我尝试使用自动生成的 Web 服务客户端代码访问 getCityWeatherByZIP 和 getCityForecastByZIP 服务。两者都静默失败,即 isSuccess() 方法返回 false 并且所有响应字段均为空:

Weather service = new Weather();
WeatherSoap weatherSoap = service.getWeatherSoap();
WeatherReturn weather = weatherSoap.getCityWeatherByZIP(ZIP);
if (weather.isSuccess()) {      
    System.out.format("%s, %s : %s : Temperature: %s, Wind: %s\n",
            weather.getCity(), weather.getState(), weather.getDescription(),
            weather.getTemperature(), weather.getWind());
}
else {
    System.out.println("Failed to obtain weather");
}

在逐步执行代码时,在 getCityWeatherByZIP() 中,我发现了以下 NoSuchMethodException: com.sun.xml.internal.ws.api.message.Packet.setHeaderList(com.sun.xml.internal.ws.api.message.HeaderList)"

这个异常发生在一行中(在 Eclipse 的 Debug 透视图中): “SEIStub.invoke(Object, Method, Object[]) 行:不可用”

很明显,Packet.setHeaderList(HeaderList) 方法是不存在的,非内部类的文档也证实了这一点: https://jax-ws.java.net/nonav/jax-ws-20-fcs/arch/com/sun/xml/ws/api/message/Packet.html

我使用的是最新的 JDK 1.7 和 Eclipse 版本:Kepler Service Release 1,Build id:20130919-0819。

我不知道如何解决这个问题。任何帮助将不胜感激。

【问题讨论】:

标签: java web-services weather wsimport


【解决方案1】:

除了本书的源代码之外,您还需要一份 JAX-WS Web 服务代码的副本才能编译和运行。您更新 Eclipse 中的构建路径以引用 JAX-WS Web 服务的任何 jar,听起来 Eclipse 在类路径上没有副本。

JAX-WS 是规范,但您需要 JAX-WS 的实际实现才能运行,可能是参考实现?

【讨论】:

  • 嗯,我也有一个非常简单的 Web 服务实现,它使用书中另一个示例中的 WebService 和 WebMethod 注释,它似乎运行良好。不用做任何特别的事情,我可以在 Eclipse 中启动程序,然后使用浏览器访问正在运行的服务器,例如获取自动生成的 WSDL 文件。我上面描述的客户端代码编译并运行,没有任何可见的异常(我只能在单步执行代码时看到异常);但是,WeatherReturn 和 ForecastReturn 实例只是空的。所以,我不知道该怎么办。
  • 你看过这个页面吗 - wiki.cdyne.com/index.php/CDYNE_Weather#Example_Source_Code 来自他们的 wiki - 看起来它在页面底部有一些链接,指向不同语言的一些示例。
  • 谢谢,但这并不能解决问题。书中的代码非常简单明了,并使用由 wsimport 从 cdyne 的 WSDL 自动生成的类提供的 API。顺便说一句,这表示 JDK 1.7 包含 JAX-WS 2.2:docs.oracle.com/javase/7/docs/technotes/guides/xml/jax-ws 这解释了为什么我可以编译和运行客户端和服务器,而无需在 Eclipse 或命令行中进行任何特殊操作。
猜你喜欢
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 2012-04-08
相关资源
最近更新 更多