CXF- 报 两个类具有相同的 XML 类型名称 异常错误

12年前

今天采用tomcat+CXF生成webservice时,遇到一个问题

 Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
两个类具有相同的 XML 类型名称 "{http://www.paxdata.com/pboss/}createRoleResponse"。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。
 this problem is related to the following location:
  at com.paxdata.pboss.upm.jws.bean.CreateRoleResponse
  at private com.paxdata.pboss.upm.jws.bean.CreateRoleResponse com.paxdata.pboss.upm.jws.jaxws_asm.CreateRoleResponse.createRoleReturn
  at com.paxdata.pboss.upm.jws.jaxws_asm.CreateRoleResponse
 this problem is related to the following location:
  at com.paxdata.pboss.upm.jws.jaxws_asm.CreateRoleResponse


代码部分是这样的
    @WebMethod(action="createRole",operationName = "createRole")
   @WebResult(name = "createRoleReturn", targetNamespace = "http://www.paxdata.com/pboss/")  
  public CreateRoleResponse createRole(
          @WebParam(name = "BaseRequest", targetNamespace = "http://www.paxdata.com/pboss/")
          BaseRequest pubReq,
          @WebParam(name = "Role", targetNamespace = "http://www.paxdata.com/pboss/")
          RoleInf role) throws Exception

于是我仔细查看了原先在weblogic下正常生成的wsdl文件,和在tomcat中采用CXF生成的正常的WSDL文件,发现weblogic中对于WebResult中的name中的值 只是产生一个Response的引用。而在tomcat下则会生成一个createReturn的ComplexType
而jax_ws中会根据每一个方法名生成一个  methodname+"response"的类。于是问题就出现了
首先 jax_ws根据方法名生成一个createRoleResponse。   当tomcat下再次生成WebResult的类的时候 发现name的值为小写,不符合java规范(这部分是猜测的,如果大家有正确的解释,欢迎提供),于是就再生成一个createRoleResponse的类,这样就冲突了。

解决方案: jax_ws根据方法名生成methodname+"Response"时,是根据operationName的,所以将operationName改为大写后,则会避免生成两个同样的类。 但是这里建议的话,返回的类型最好不要采用Response结尾的,另外就是WebMethod和WebResult中的值最好大写,符合规范。