目录
wsimport 简介
wsimport 使用示例
服务端
客户端
调用测试
1、Java JDK 的 bin文件夹下有一个 wsimport.exe 工具,可依据 wsdl 文件生成相应的类文件,将生成好的类文件拷贝到需要使用的项目中,就可以像调用本地的类一样调用 webService 提供的方法。
2、wsimport.exe 工具可以用于非 Java 的 webService 服务器,如用 C# 、.net 等语言编写的 WebService 服务端,只要得到了其 wsdl 文件,则通过 wsimport 即可生成 Java 客户端实现。
3、只要在电脑上配置了 Java JDK 的环境变量,则可以在任意目录下使用 cmd 窗口执行 wsimport 命令,如下所示可以看到命令的格式、以及参数、使用示例等。
C:\Users\Administrator.SC-201707281232>wsimport
缺少 WSDL_URI
用法: wsimport [options]
\其中 [options] 包括:
-b 指定 jaxws/jaxb 绑定文件或附加模式
(每个 都必须具有自己的 -b)
-B 将此选项传递给 JAXB 模式编译器
-catalog 指定用于解析外部实体引用的目录文件
支持 TR9401, XCatalog 和 OASIS XML 目录格式。
-d 指定放置生成的输出文件的位置
-encoding 指定源文件所使用的字符编码
-extension 允许供应商扩展 - 不按规范
指定功能。使用扩展可能会
导致应用程序不可移植或
无法与其他实现进行互操作
-help 显示帮助
-httpproxy:: 指定 HTTP 代理服务器 (端口默认为 8080)
-keep 保留生成的文件
-p 指定目标程序包
-quiet 隐藏 wsimport 输出
-s 指定放置生成的源文件的位置
-target 按给定的 JAXWS 规范版本生成代码
默认为 2.2, 接受的值为 2.0, 2.1 和 2.2
例如, 2.0 将为 JAXWS 2.0 规范生成兼容的代码
-verbose 有关编译器在执行什么操作的输出消息
-version 输出版本信息
-wsdllocation @WebServiceClient.wsdlLocation 值
-clientjar 创建生成的 Artifact 的 jar 文件以及
调用 Web 服务所需的 WSDL 元数据。
-generateJWS 生成存根 JWS 实现文件
-implDestDir 指定生成 JWS 实现文件的位置
-implServiceName 生成的 JWS 实现的服务名的本地部分
-implPortName 生成的 JWS 实现的端口名的本地部分
\扩展:
-XadditionalHeaders 映射标头不绑定到请求或响应消息不绑定到
Java 方法参数
-Xauthfile 用于传送以下格式的授权信息的文件:
http://username:[email protected]/stock?wsdl
-Xdebug 输出调试信息
-Xno-addressing-databinding 允许 W3C EndpointReferenceType 到 Java 的绑定
-Xnocompile 不编译生成的 Java 文件
-XdisableAuthenticator 禁用由 JAX-WS RI 使用的验证程序,
将忽略 -Xauthfile 选项 (如果设置)
-XdisableSSLHostnameVerification 在提取 wsdl 时禁用 SSL 主机名
验证
\示例:
wsimport stock.wsdl -b stock.xml -b stock.xjb
wsimport -d generated http://example.org/stock?wsdl
C:\Users\Administrator.SC-201707281232>
常用命令如下:
wsimport -keep -d D:\temp\d -s D:\temp\s -p com.map -verbose http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl
-keep:是否生成java源文件,即在生成 .class 文件的同时也会生成 .java 源文件
-d:指定.class文件的输出目录,此目录必须存在。
-s:指定.java文件的输出目录,不指定时,默认与 -d 设置的路径一致
-p:定义生成类的包名,不指定时保持与原来一致
-verbose:在控制台显示输出信息
-b:指定jaxws/jaxb绑定文件或额外的schemas
-extension:使用扩展来支持SOAP1.2
《JWS(Java Web Service) 第一个案例入门》中的 webService 客户端是直接写的与服务端一样的接口,对于公司内部,或者很要好的合作伙伴找人家开发人员直接获取 webservice 提供的接口源码也不是不行,看起来是 low 了一点,但也是一个办法。
现在就开始使用 Java JDK 提供的 wsimport 工具来根据服务端提供的 wsdl 文件直接生成类文件,只要服务商提供了 wsdl 地址,自己就可以默默的生成类文件然后调用。
这个示例仍然以《JWS(Java Web Service) 第一个案例入门》中的 "ws 服务端"作为 webservice 的服务端,就不再反复粘贴代码了。
启动 webService 服务端如下:
仍然以《JWS(Java Web Service) 第一个案例入门》中"客户端"项目进行改写,先删除其中的 CalculatorService 文件,改用 wsimport.exe 进行生成。
1、使用命令如下,其中的 E:/wmx/webservice 目录用于存放生成好的文件,必须事先创建好:
wsimport -d E:/wmx/webservice -keep -verbose http://192.168.1.20:3333/web_server/calculator?wsdl
2、命令执行成功后,生成文件内容如下:
下面虽然也生成了接口的实现类 CalculatorServiceImplService.java (名称上比服务端上多加了后面的 Service),但是其中的内容和 webService 服务端是完全不一样的,不用担心源码泄露。
生成的 CalculatorService.java 接口中的内容大致与服务器上一致,接口中的方法名称肯定是一样的,也有其它很大内容不一致。
如上所示,服务端只对外提供了一个接口 CalculatorService 与其实现类 CalculatorServiceImpl,而 wsimport.exe 命令却生成了这么多文件。
仔细看可以发现:Addition 、Multiplication 分别是服务端 CalculatorService 接口中定义加法函数、乘法函数。
所以客户端需要使用的就是其中的 Addition.java、AdditionResponse.java、Multiplication.java、MultiplicationResponse.java、CalculatorService.java,以及 ObjectFactory.java 文件。接口的实现类以及其它类可以不用导入,当然全部导入也不会出错。
补充一句:部署阶段,直接使用上面的 .class 文件也是可以的。
导入生成好的文件如上,其中 Web_service 类用于调用 webservice 服务,与 《JWS(Java Web Service) 第一个案例入门》中的代码完全一致,这里再次粘贴一次,内容如下:
import com.lct.web_service.CalculatorService;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Logger;
/**
* Created by Administrator on 2019/1/25 0025.
*/
public class Web_service {
//日志记录器
public static final Logger logger = Logger.getGlobal();
public static void main(String[] args) {
try {
/** url:webservice 服务端提供的服务地址,结尾必须加 "?wsdl"*/
URL url = new URL("http://192.168.1.20:3333/web_server/calculator?wsdl");
/** QName 表示 XML 规范中定义的限定名称,QName 的值包含名称空间 URI、本地部分和前缀。
* QName(final String namespaceURI, final String localPart):指定名称空间 URI 和本地部分的 QName 构造方法。
* 如下所示的两个数据都可以浏览器访问服务端时返回 xml 中第一行找到,如:
*
*/
QName qName = new QName("http://web_service.lct.com/", "CalculatorServiceImplService");
/**
* Service 对象提供 Web 服务的客户端视图
* Service 作为以下内容的工厂:1、目标服务端点的代理,2、用于远程操作的动态面向消息调用的 javax.xml.ws.Dispatch 实例。
* create(java.net.URL wsdlDocumentLocation,QName serviceName):创建 Service 实例。
* wsdlDocumentLocation : 服务 WSDL 文档位置的 URL
* serviceName : 服务的 QName
*/
Service service = Service.create(url, qName);
/**
* 使用 getPorts 方法可以对服务上可用的端口/接口进行枚举
* getPort(Class serviceEndpointInterface):获取支持指定服务端点接口的对象实例
* serviceEndpointInterface:指定返回的代理所支持的服务端点接口
*/
CalculatorService calculatorService = service.getPort(CalculatorService.class);
float added = calculatorService.addition(100, 80);
float multied = calculatorService.multiplication(2.5F, 100);
logger.info("added:" + added);
logger.info("multied:" + multied);
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
与《JWS(Java Web Service) 第一个案例入门》完全一致,调用成功。
特别说明
如果客户端将 wsimport.exe 生成的类全部导入,主要指服务端接口的实现类,也就是上面的 CalculatorServiceImplService.java,这样客户端调用服务端方法时,也可以采用如下的方式:
CalculatorServiceImplService calculatorServiceImplService = new CalculatorServiceImplService();
CalculatorService calculatorService = calculatorServiceImplService.getCalculatorServiceImplPort();
float added = calculatorService.addition(100,80);
float multied = calculatorService.multiplication(2.5F,100);