【问题标题】:JAX-WS RI generated code with hard-coded file paths?JAX-WS RI 生成带有硬编码文件路径的代码?
【发布时间】:2013-08-26 14:30:04
【问题描述】:

我继承了一个代码库,其中一部分是使用 Eclipse 生成器构建的 Web 服务。生成的代码似乎有许多文件路径(用于 wsdls 等),它们引用了原始开发人员框上的位置。例如,在服务类的静态构造函数中:

url = new URL(baseUrl, "file:/C:/Users/OldDeveloperName/workspace/ServiceProject/WebContent/WEB-INF/edmo/AXIS-1-4/MainEntityService-1.0.wsdl");

在我天真的眼里,这似乎是一件坏事。这是 a) 好的,还是 b) 可修复的?我知道我现在可以编辑它,但是有很多服务文件,如果这是一个常见问题,似乎很容易更正。我的意思是,它在我看来根本无法部署。

【问题讨论】:

  • 通常在构建时需要 WSDL 来生成客户端(或服务器)存根。除非您有一些动态 Web 服务调用,否则您在运行时不需要它。您应该能够将其移动到相对路径并使用它。

标签: java jax-ws


【解决方案1】:

原始开发者显然遵循了将 WSDL 存储在本地的方法,这实际上是一种很好的做法。也就是说,JAX-WS 客户端在执行之前需要再次从原始位置检索 WSDL 以检查其他元数据等(这听起来很奇怪,但这就是它的工作原理)。但是,如果原始 WSDL 不再可用,或者 Web 服务开发人员更新了 WSDL,例如新方法?您的 Web 服务调用不会被执行,这可能不是您想要的。因此,人们开始将 WSDL 与他们的客户端一起存储,以避免 WSDL 可用性/更改的漏洞。

这是 a) 好的,还是 b) 可修复的?

将 WSDL 存储在本地 文件系统 上是不行的,这就是最初的开发者犯下大错的地方。 WSDL 应该与 Web 服务客户端一起打包(在同一个 JAR 中)并直接从存档中检索。有几种方法可以在本地检索 WSDL,有关说明,请参阅this tutorial。无论哪种方式,您都可以编辑 WSDL 位置或完全更改旧代码:)

参考资料:

【讨论】:

  • 非常感谢,这是我的怀疑(基于以其他语言/框架开发 WS 应用程序),但我想确保我没有遗漏一些 Java 标准。
  • 我遇到了一个奇怪的问题(没有这样的文件或目录)。对于硬编码的 WSDL。 WSDL 应该驻留在哪里?不就是在WAR文件里面吗?
  • @wired00 您始终可以选择不将 WSDL 放在您的 Web 服务客户端中,但最好将它与客户端打包在一起。在这种情况下 - 是的,它应该位于您的 .jar/.war 档案中的某个位置。通过使用注释或 jaxws 目录文件,您可以指定确切的位置。如果没有看到实际代码和存档内容,很难说出为什么会得到“没有这样的文件或目录”。
  • @MiljenMikic 感谢您在将近一天的时间拉扯我的头发后的回答,我发现该文件确实应该位于服务器根目录的直接位置,这只是看起来很讨厌,因为如果WSDL 没有同时更新,那么Java 组件(部署为WAR)的任何重大升级都会很容易受到攻击......?在整个过程中弄清楚这是一场噩梦,我显然假设它与 WAR 根相关但我在此过程中学到了很多东西。所以你说我假设 WSDL 应该 位于WAR 内是正确的?我讨厌遗留项目;)
  • @wired00 是的,它肯定需要在 .war 中。但是,您应该知道,一旦您的 .war 部署在应用程序服务器上,它将被解包并放在服务器文件系统的某个位置。因此,出现“没有这样的文件或目录”这样的错误意味着您的应用程序无法在服务器的文件系统上找到 WSDL。但是,如果一切设置正确,您的应用程序应该始终寻找相对路径,而不是绝对路径。将其与 OP 的情况进行比较 - 他在项目内部有一个硬编码的 WSDL 的绝对路径,这是完全错误的。
猜你喜欢
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多