8

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

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

所以,我的问题:

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

6 回答 6

4

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

<element name="Foo" .../> 和 <element name="foo" .../>

这可能会导致该错误。另一个是使用连字符和下划线之类的东西,通常会被消除+封顶: <element name="doFoo" .../> 和 <element name="do_foo" .../>

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

于 2009-02-23T20:48:21.200 回答
1

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

真正困难的是安全。我必须使相互证书身份验证工作,它仍然有一些问题。

于 2009-02-24T08:35:37.710 回答
0

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

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

于 2009-02-23T20:23:17.813 回答
0

我用 Axis2 客户端开发了 WCF。我成功使用的身份验证方法是 BasicHttpBinding/SSL/Basic(传输)和带有用户名(和 MTOM)的 WS-Security。

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

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

于 2009-02-23T20:40:12.220 回答
0

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

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

于 2009-02-24T08:04:32.200 回答
0

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

于 2010-07-19T16:21:54.963 回答