如何最好地公开 WCF 服务,以便可以轻松地从 Java/CXF 中使用?

8
我们编写了一个WCF服务,供Java商店使用。他们使用CXF生成适配器。我们不太熟悉Java,但已经使用basicHttpBinding、SSL和基本身份验证公开了服务。集成测试表明,.NET客户端可以很好地使用该服务。然而,Java商店在使用该服务时遇到了问题。具体来说,他们遇到了以下JAXB错误:ObjectFactory类中有两个声明导致冲突。当CXF尝试创建适配器类时,通常是因为两个操作具有相同的名称和命名空间引起的。我们找不到任何类型或操作名称应该导致任何形式的冲突。我们确保所有自定义类型都指定了命名空间,并且在WSDL中没有指定tempuri.org。Java商店怀疑错误是由于生成的WSDL包含xsd:import元素。
所以,我的问题是:
  • 除了CXF,还有比CXF更好的方法让Java商店使用WCF服务吗?Project Tango看起来很有趣,但我不知道足够的信息告诉他们考虑使用它。CXF是否是Java的事实标准?
  • BasicHttpBinding / SSL / Basic Auth是MS推荐的互操作场景,但客户端仍然存在互操作问题。我们应该考虑其他绑定或设置,以使其更容易使用吗?
  • 是否有一种方法可以配置WCF始终输出没有模式导入的单个WDSL?
6个回答

4
“ObjectFactory类中两个声明发生冲突”错误消息通常与导入无关。这是一个JAXB错误消息,通常是由于有多个元素或类似的元素导致生成的字段名称相同引起的。例如,如果您有以下元素:
<element name="Foo" .../> 和 <element name="foo" .../>
这可能会导致该错误。另一个问题是使用连字符和下划线等通常会被消除并大写的内容,例如: <element name="doFoo" .../> 和 <element name="do_foo" .../>
在2.1.4版本中,您可以尝试使用-autoNameResolution标志运行wsdl2java。这有时有助于解决此问题,但并非总是如此。不幸的是,在这些情况下,JAXB提供的信息几乎没有用处,很多时候只能通过反复尝试找到冲突类型。 :-(

记录一下,我的WCF服务中有名为“OperationNameRequest”和“OperationNameResponse”的类型,与同名的Java生成类型发生了冲突。Java开发人员通过调整WSDL文件来解决了这个问题。 - Daniel

1

我深入研究Java和WCF互操作性。正如其他人所说,如果您正在使用基于文件的WSDL,则需要扁平化您的WSDL。但是,我使用的是Netbeans 6.5,如果您指向一个真实的URL,例如http://myservice/?wsdl,Netbeans可以轻松处理WCF生成的默认WSDL。

在现实生活中,您需要考虑的其他事情包括服务版本控制、可选数据成员(在Java中不太好用,因此建议将所有数据成员IsRequired=true)、顺序等。

真正困难的是安全性。我必须使双向证书身份验证工作,并且它仍然存在一些问题。


0

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


0

你的Java客户端与WCF组件通信的唯一方式将是使用HTTP方法之一 - basicHttpBinding,ws*等,就像微软建议的那样。Java无法通过TCP或namedPipes或MSMQ等协议与WCF通信。

我建议从一个超级简单的WCF组件开始 - 一个只有一个方法并输出字符串的组件。确保它能够与Java通信,然后逐步增加功能。确保你暴露的所有内容都是使用基本类型或定义良好的[DataContract]对象工作的。


0

0

xsd:import的问题非常常见。一些工具包或者运行时环境无法处理它。为了解决这个问题,你可以压缩WCF生成的WSDL文件。 请参阅this post

关于CXF是否是正确的Java堆栈 - 我从未听说过?我成功地使用了AXIS和JAX-WS,两者都相当简单明了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接