CXF- 报 两个类具有相同的 XML 类型名称 异常错误
今天采用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中的值最好大写,符合规范。