从C# WCF服务生成Java类时ObjectFactory命名冲突不重命名如何解决
wsimport生成WCF服务Java类同名类冲突解决方案
报错核心原因
默认wsimport会将WSDL中不同XML命名空间下的同名类型,生成到同一个Java包路径下,导致ObjectFactory类中生成的两个创建Foo类的方法签名重复,触发冲突报错。
可行解决方案(无需修改服务端C#代码)
使用JAXB自定义绑定文件,将不同XML命名空间对应的类生成到不同的Java包下,从根源避免命名冲突,不需要修改服务端的类名,也不需要添加Name属性。
操作步骤
- 新建自定义绑定文件,命名为
wsimport-binding.xjb,内容如下:
<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- 匹配WCF中Request命名空间对应的XML命名空间,映射到独立Java包 --> <jaxb:bindings targetNamespace="http://schemas.datacontract.org/2004/07/App.TestService.Request"> <jaxb:schemaBindings> <jaxb:package name="com.yourcompany.service.request"/> </jaxb:schemaBindings> </jaxb:bindings> <!-- 匹配WCF中Response命名空间对应的XML命名空间,映射到独立Java包 --> <jaxb:bindings targetNamespace="http://schemas.datacontract.org/2004/07/App.TestService.Response"> <jaxb:schemaBindings> <jaxb:package name="com.yourcompany.service.response"/> </jaxb:schemaBindings> </jaxb:bindings> </jaxb:bindings>
注:WCF DataContract默认生成的XML命名空间规则为
http://schemas.datacontract.org/2004/07/拼接.NET类的完整命名空间,如果你手动修改过服务端DataContract的Namespace属性,替换上面targetNamespace的值为你自定义的即可。
- 修改wsimport执行命令,添加
-b参数指定绑定文件:
wsimport http://path/to/service.svc?wsdl -Xnocompile -extension -keep -XadditionalHeaders -B-XautoNameResolution -b wsimport-binding.xjb
执行命令后,Request命名空间下的Foo类会生成到com.yourcompany.service.request包,Response命名空间下的Foo类会生成到com.yourcompany.service.response包,两个包下的ObjectFactory互相独立,不会出现冲突。
内容的提问来源于stack exchange,提问作者Beetlejuice
相关产品推荐
相关产品推荐

