两个类具有相同的 XML 类型名称。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。

说明:

此问题是在webservice服务通过wsimport指令生成客户端之后,编写测试代码测试时的报错。

问题出现原因:

由于生成客户端时,没有指定路径,因此默认生成的路径还是原先服务端提供的路径。

解决办法:

通过wsimport指令指定路径生成客户端,然后重新加载。

过程详情:

首先,构建一个webservice服务端:

package com.learn.Server;

import javax.jws.WebService;
import javax.xml.ws.Endpoint;

@WebService
public class MyFirstWebservice {
	
	public String testWebService(String content){

		System.out.println("服务端收到了:" + content);
		
		String result = "Hello ," + content;
		
		return result ;
	}
	
	public static void main(String[] args){
		
		String address = "http://localhost:9090/MyFirstWebService"; 
	
		Endpoint.publish(address, new MyFirstWebservice());
		
		System.out.println("starting......");
	}

将其启动,然后执行:wsimport  -s . http://localhost:9090/MyFirstWebService?wsdl 获得客户端文件

生成客户端:

两个类具有相同的 XML 类型名称。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。

将其copy到对应的workspace工程目录下,然后编写测试代码:

package com.learn.webservice;

import com.learn.Client.MyFirstWebservice;
import com.learn.Client.MyFirstWebserviceService;



public class FirstWebservice {
	
	public static void main(String[] args) {
		
		MyFirstWebserviceService service = new MyFirstWebserviceService();
		
		MyFirstWebservice port = service.getMyFirstWebservicePort();
		
		String result = port.testWebService("zhangsan");
		
		System.out.println(result);
		
		
	}

}

启动运行就会看到如题报错!!!!!!!

 至于问题原因就是,在MyFirstWebService.java文件中:

两个类具有相同的 XML 类型名称。请使用 @XmlType.name 和 @XmlType.namespace 为类分配不同的名称。

 

 处,classname因为构建的时候没有重新指定构建文件目录,因此会保留原本的服务器端包名。因此改正方法就是:

1) 重新构建:进入工程src目录后,执行 :

wsimport -keep -p com.learn.webservice(测试包名)   http://localhost:9090/MyFirstWebService?wsdl

重新生成客户端后Classname为:

 

重新运行测试代码,即可。

2) 自己动手修改classname中的参数,修改为本工程客户端存放的TestWebService地址(本文中为:com.learn.Client.TestWebService和com.learn.Client.TestWebServiceResponse),两处都需要改哦!