【问题标题】:What is the best way to expose a WCF service so that it can be easily consumed from Java/CXF?公开 WCF 服务以便可以从 Java/CXF 轻松使用它的最佳方法是什么?
【发布时间】:2009-02-23 19:24:46
【问题描述】:

我们编写了一个 WCF 服务,供 Java 商店使用,该商店使用 CXF 生成适配器。我们对 Java 不是很熟悉,但是已经使用 basicHttpBinding、SSL 和基本身份验证公开了该服务。集成测试表明 .NET 客户端可以很好地使用该服务。但是,Java 商店在使用该服务时遇到了问题。具体来说,他们得到以下 JAXB 错误: 两个声明导致 ObjectFactory 类中的冲突。这通常是由于 CXF 尝试创建适配器类时 2 个操作具有相同的名称和命名空间而导致的。

我们找不到任何会导致任何类型冲突的类型或操作名称。我们已确保所有自定义类型都指定了名称空间,并且 tempuri.org 未在 WSDL 中的任何位置指定。 Java 商店怀疑错误是因为生成的 WSDL 包含

所以,我的问题:

  • 有没有比 CXF 更好的方式让 Java 商店使用 WCF 服务? Project Tango 看起来很有趣,但我不知道如何告诉他们考虑使用它。 CXF 是 Java 中的事实标准吗?
  • BasicHttpBinding/SSL/Basic Auth 是 MS 推荐的互操作方案,但客户端似乎仍然存在互操作问题。我们是否应该考虑其他绑定或设置以使其更易于使用?
  • 有没有办法将 WCF 配置为始终输出没有架构导入的单个 WDSL?

【问题讨论】:

    标签: java wcf cxf


    【解决方案1】:

    “两个声明导致 ObjectFactory 类中的冲突”错误消息通常与导入无关。这是一条 JAXB 错误消息,通常是由于有多个元素或类似元素导致生成的字段名称相同。例如,如果您有以下元素:

    这可能会导致该错误。另一个是使用连字符和下划线之类的东西,通常会被消除+封顶: 和

    在 2.1.4 中,您可以尝试使用 -autoNameResolution 标志运行 wsdl2java。有时会对此有所帮助,但并非总是如此。不幸的是,在这些情况下,JAXB 提供的信息几乎毫无价值,而且很多时候,查找冲突类型只是反复试验。 :-(

    【讨论】:

    • 作为记录,我的 WCF 服务中有名为“OperationNameRequest”和“OperationNameResponse”的类型,它们与 java 生成的同名类型冲突。 Java 开发人员能够通过按摩 WSDL 来修复。
    【解决方案2】:

    我深入研究 Java 和 WCF 互操作性。正如其他人所说,如果您使用基于文件的 WSDL,则需要扁平化您的 WSDL。但是,我使用 Netbeans 6.5,如果您指向像 http://myservice/?wsdl 这样的真实网址,Netbeans 可以轻松应对 WCF 生成的默认 wsdl。 在现实生活中,您需要考虑的其他事情是服务版本控制、可选数据成员(在 java 中并不顺利,所以我建议将所有数据成员设为 IsRequired=true)、顺序等。

    真正的难点在于安全性。我必须让相互证书身份验证工作,但它仍然存在一些问题。

    【讨论】:

      【解决方案3】:

      Java 客户端与 WCF 组件通信的唯一方法是使用一种 HTTP 方法 - basicHttpBinding、ws* 等,正如 MS 推荐的那样。 Java 无法通过 TCP 或 namedPipes 或 MSMQ 等与 WCF 通信。

      我会从一个超级简单的 WCF 组件开始 - 用一个方法来输出一个字符串。使用 Java 实现这一点,然后逐步提高。确保您公开的所有内容都使用基本类型或定义明确的 [DataContract] 对象。

      【讨论】:

        【解决方案4】:

        我已经使用 Axis2 客户端开发了 WCF。我成功使用的身份验证方法是 BasicHttpBinding/SSL/Basic (Transport) 和 WS-Security with Username (and MTOM)。

        SUN 和 Microsoft 使用 Metro 实现来测试互操作: http://weblogs.java.net/blog/haroldcarr/archive/2007/11/metro_web_servi.html

        抱歉,不知道 WCF 为架构定义生成的导入。

        【讨论】:

          【解决方案5】:

          xsd:import 的问题很常见。一些工具包或运行时无法应对。为了解决这个问题,您可以展平由 WCF 生成的 WSDL。 检查this post

          关于 CXF 是否是正确的 Java 堆栈 - 我从未听说过?我已经成功使用了 AXIS 以及 JAX-WS。两者都非常简单。

          【讨论】:

            【解决方案6】:

            这是一个 Jaxb 问题。我遇到了同样的问题,但在 wsdl2java 客户端生成中使用了 xmlbeans 选项。老实说,就消费者而言,我似乎更喜欢 xmlbeans 对象而不是 jaxb。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2010-09-22
              • 1970-01-01
              • 2010-10-11
              • 1970-01-01
              • 1970-01-01
              • 2010-10-26
              相关资源
              最近更新 更多