You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从C# WCF服务生成Java类时ObjectFactory命名冲突不重命名如何解决

wsimport生成WCF服务Java类同名类冲突解决方案

报错核心原因

默认wsimport会将WSDL中不同XML命名空间下的同名类型,生成到同一个Java包路径下,导致ObjectFactory类中生成的两个创建Foo类的方法签名重复,触发冲突报错。

可行解决方案(无需修改服务端C#代码)

使用JAXB自定义绑定文件,将不同XML命名空间对应的类生成到不同的Java包下,从根源避免命名冲突,不需要修改服务端的类名,也不需要添加Name属性。

操作步骤

  1. 新建自定义绑定文件,命名为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的值为你自定义的即可。

  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:24:01