【问题标题】:how to reconcile conflict between original and generated file within Java web services?如何协调 Java Web 服务中原始文件和生成文件之间的冲突?
【发布时间】:2010-03-29 21:03:16
【问题描述】:

我有一个使用 mypackage.Foo 类的旧版 Java 应用程序。我希望该应用程序利用返回 Foo 实例的 Web 服务。为了连接到这个 Web 服务,我在 WSDL 上使用 wsimport 来生成工件,它给了我另一个 Foo.java 文件。理想情况下,我想告诉 wsimport 生成使用原始 Foo 的工件并且不生成任何额外的 Foo 文件,但我还没有找到方法来做到这一点。如何协调 Java 应用程序中的两个 Foo 文件?看来我的选择是:

1) 将生成的 Foo 文件放入另一个包中。但是随后将 otherpackage.Foo 分配给 mypackage.Foo 变量失败

2) 使用生成的 Foo 代替原来的 Foo。在某些情况下,这似乎是最好的解决方案,但原始 Foo 具有生成的 Foo 中没有的功能。此外,在应用程序范围内进行更改是不可行的。

3) 使用第一个选项,并编写一个方法,手动将 otherpackage.Foo 的字段复制到 mypackage.Foo 中。如果一切都失败了,这就是我要做的,但看起来非常不优雅。

我确定我错过了一个简单的最佳实践。欣赏任何见解!

【问题讨论】:

  • 想知道您是否曾经使用 wsimport 得到过满意的答案?我有同样的问题 (stackoverflow.com/questions/2642583/…)
  • 一位同事向我提出了一个可行的解决方案,该解决方案使用绑定将复杂的 WSDL 类型映射到本地类,基本上是告诉 wsimport 不要为这些类生成存根,而要使用本地类。这个例子使用的是 maven,所以我不确定规范版本会是什么样子,但关键是一个 bindings.xml 文件,其中包含诸如之类的条目
  • jxb:bindings version="1.0" xmlns:jxb="java.sun.com/xml/ns/jaxb" xmlns:xs="w3.org/2001/XMLSchema"> - trenton:8080/webapp1/HelloService?xsd=1" node=" /xs:schema"> - 一旦我对它的工作原理有了更好的了解,我打算发布一个答案

标签: java web-services wsimport


【解决方案1】:

当您从 WSDL 生成 Java 代码时,您可以使用 Apache CXF 及其 wsdl2java 工具(或使用 maven-cxf-codegen-plugin)并指定以下选项:

-nexclude <schema-namespace>=<java-package> 

使用此选项将:

  • 告诉 wsdl2java 工具不要从给定的 XML 命名空间生成类,
  • 告诉工具从给定的 java 包导入生成的代码。

当然被引用的类在编译时必须存在于 java-package 中(代码生成时不需要)。

在您的示例中使用:

wsdl2java -nexclude <some-schema-namespace-I-dont-know>=mypackage

【讨论】:

  • 这看起来不错,但是当我这样做时,我得到一个错误,因为生成的 WebService 接口有一个@XmlSeeAlso({mypackage.ObjectFactory.class, ...}),而这个提到的类现在不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 2018-12-22
相关资源
最近更新 更多