整合两个WebMethod时出现XML类型命名冲突问题求助
解决WebService整合时的XML类型名冲突问题
问题原因
你遇到的Name collision错误,核心原因是WebService依赖的JAXB(XML绑定框架)在处理类A和B时,生成了相同URI和名称的XML类型。具体诱因:
A和B均继承自C,且都重写了同名的name属性(父类为String类型,子类为C类型);- 默认映射规则下,JAXB会为这两个子类生成重复的XML类型标识,导致冲突。修改
@WebMethod的operationName只能区分方法名,无法解决类的XML类型冲突。
修复方案
方案1:从XSD根源修改(推荐)
因为类由XSD生成,直接调整XSD定义可彻底规避冲突:
- 给
A和B对应的complexType指定不同名称,或分配不同命名空间; - 对子类中的
name属性,指定与父类不同的XML元素名称,示例XSD代码:
重新生成Java类后,冲突会自动消失。<xs:complexType name="TypeA"> <xs:complexContent> <xs:extension base="C"> <xs:element name="aName" type="C"/> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="TypeB"> <xs:complexContent> <xs:extension base="C"> <xs:element name="bName" type="C"/> </xs:extension> </xs:complexContent> </xs:complexType>
方案2:在生成的Java类上添加JAXB注解
若无法修改XSD,直接在生成的Java类上添加注解调整XML映射:
- 区分类的XML类型名:给
A和B添加@XmlType注解,指定不同name:import javax.xml.bind.annotation.XmlType; @XmlType(name = "TypeA", namespace = "http://xxx") class A extends C { C name; // getter、setter方法 }@XmlType(name = "TypeB", namespace = "http://xxx") class B extends C { C name; // getter、setter方法 } - 区分属性的XML元素名:子类
name属性与父类重名,可添加@XmlElement指定不同名称:import javax.xml.bind.annotation.XmlElement; class A extends C { @XmlElement(name = "aName") C name; // getter、setter方法 }class B extends C { @XmlElement(name = "bName") C name; // getter、setter方法 }
方案3:调整WebMethod参数映射
配合上述方案,给两个WebMethod的入参添加@WebParam指定不同参数名,进一步避免混淆:
@WebMethod(operationName = "operationA") public void processA(@WebParam(name = "inputA") A inputA) { // 业务逻辑 } @WebMethod(operationName = "operationB") public void processB(@WebParam(name = "inputB") B inputB) { // 业务逻辑 }
内容的提问来源于stack exchange,提问作者André Gonçalves
相关产品推荐
相关产品推荐

