我们编写了一个WCF服务供Java商店使用,他正在使用CXF生成适配器。我们不熟悉Java,但使用basicHttpBinding,SSL和基本身份验证公开了服务。集成测试表明.NET客户端可以正常使用该服务。但是,Java商店在使用该服务时遇到了麻烦。具体来说,它们会得到以下JAXB错误:两个声明会导致ObjectFactory类发生冲突。当CXF尝试创建适配器类时,如果2个操作具有相同的名称和命名空间,则通常会导致这种情况。
我们找不到任何应该导致任何类型碰撞的类型或操作名称。我们已确保所有自定义类型都指定了命名空间,并且未在WSDL中的任何位置指定tempuri.org。 Java商店怀疑错误是因为生成的WSDL包含< xsd:import元素。
所以,我的问题:
答案 0 :(得分:4)
“两个声明导致ObjectFactory类中的冲突”错误消息通常与导入无关。这是一个JAXB错误消息,通常由多个元素或类似元素导致生成的字段名称相同。例如,如果您有以下元素:
< element name =“Foo”... /> 和 < element name =“foo”... />
这可能会导致错误。另一个是使用像连字符和下划线这样的东西,通常是消除+上限: < element name =“doFoo”... /> 和 < element name =“do_foo”... />
使用2.1.4,您可以使用-autoNameResolution标志TRY运行wsdl2java。 SOMETIMES对此有所帮助,但并非总是如此。不幸的是,JAXB在这些情况下提供的信息几乎一文不值,而且很多时候找到冲突的类型只是反复试验。 : - (
答案 1 :(得分:1)
我使用Axis2客户端开发了WCF。我成功使用的身份验证方法是BasicHttpBinding / SSL / Basic(传输)和WS-Security with Username(和MTOM)。
SUN和Microsoft使用Metro实现来测试互操作: http://weblogs.java.net/blog/haroldcarr/archive/2007/11/metro_web_servi.html
很抱歉没有关于WCF为架构定义生成的导入的线索。
答案 2 :(得分:1)
我深入Java& WCF互操作性。正如其他人所说,如果您正在使用基于文件的WSDL,则需要展平您的WSDL。但是我使用Netbeans 6.5,如果你指向像http://myservice/?wsdl这样的真实网址,Netbeans可以轻松应对WCF生成的默认wsdl。 在现实生活中,您需要考虑的其他事情是服务版本控制,可选数据库(在java中不顺利,所以我建议使所有数据库IsRequired = true),订单等。
真正艰难的事情是安全。我不得不使相互证书认证工作,但它仍然存在一些问题。
答案 3 :(得分:0)
您的Java客户端与WCF组件通信的唯一方法是HTTP方法之一 - basicHttpBinding,ws *等,就像MS建议的那样。 Java无法通过TCP或namedPipes或MSMQ等与WCF通信。
我从一个超级简单的WCF组件开始 - 有一个方法可以吐出一个字符串。使用Java,然后按照自己的方式工作。确保您正在公开的所有内容都使用基本类型或定义良好的[DataContract]对象。
答案 4 :(得分:0)
xsd:import的问题很常见。有些工具包或运行时无法应对。要解决此问题,您可以展平由WCF生成的WSDL。 检查this post。
关于CXF是否是正确的Java堆栈 - 我从未听说过它?我成功地使用了AXIS,以及JAX-WS。两者都很简单。
答案 5 :(得分:0)
这是一个Jaxb问题。我遇到了同样的问题,但在wsdl2java客户端生成中使用了xmlbeans选项。老实说,我似乎比jaxb更喜欢xmlbeans对象,而不是这个web服务的消费者。