使用wsimport命令将wsdl文件生成服务端以及客户端
背景介绍
最近在做一项目,内部系统之间的调用通过ESB系统进行连接的,由于需要作为客户端对接第三方服务端系统,也需要自己系统作为服务端让其他系统调用,所以所有的服务端都需要将服务(接口)发布到ESB上。为了更方便客户端的调用,根据接口文档生成WSDL文件,让其客户端能快速的开发使用。把使用后的流程以及使用总结给与大家分享。
WSDL文件介绍
WSDL 文档仅仅是一个简单的XML文档。它包含一系列描述某个 web service 的定义。
APACHE.CXF介绍
Apache CXF = Celtix + XFire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。
soapui介绍
soapui提供一个工具通过soap/http来检查,调用,实现web service和web service的功能/负载/符合性测试。该工具既可作为一个桌面应用软件使用,也可利用插件集成到Eclipse,maven2.X,netbeans 和intellij中使用。我们这里是使用软件进行单独测试的,安装部署以及使用情况请自行查阅资料。
自身系统作为客户端
当我们作为客户端,去调用第三方服务端时,先拿到wsdl文件,可以使用soapUI来检查是否wsdl文件正确性,正确无误可进行后续操作。
流程
验证WSDL文件有效
使用soapui可以进行验证
命令生成java代码
wsimport的用法
wsimport [options] <WSDL_URI>
比较常用的[options]有:
- -d
在指定的目录生成class文件 - -clientjar
在当前目录生成jar文件,结合-d 可以在指定的目录生成jar文件 - -s
在指定的目录生成java源文件 - -p
指定生成文件的包结构 - -keep
在生成class文件,或者jar包时,同时保留java源文件
例如:wsimport -s D:\temp -p com.yyy xxx.wsdl
yyy最好与你生成代码后存放的服务包名一致,xxx为你的wsdl文件名称。
将代码存放到系统指定位置
注意2点:
1、代码中的wsdl文件存放目录需要修改为程序存放wsdl的目录。
2、wsdl文件中的地址请修改为正确地址。
Apache CXF引用
版本根据实际情况而定。
代码整合
自身作为webService服务端
当第三方系统调用自身系统的api接口时,需要自身系统来做webService服务,将API发布到ESB系统。
流程
发布webService服务
其他的流程和作为客户端流程一致,就不用多说了,详细的介绍一下发布webService服务的步骤。
1、实现类编写,用于业务逻辑处理,处理客户端发来的请求。
2、配置类编写,用于发布服务。
package com.vrv.servers.config;
import com.sun.org.apache.bcel.internal.generic.IUSHR;
import com.vrv.servers.impi.UserServiceImpi;
import com.vrv.servers.service.IUserService;
import org.apache.cxf.Bus;
import org.apache.cxf.bus.spring.SpringBus;
import org.apache.cxf.jaxws.EndpointImpl;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.xml.ws.Endpoint;
@Configuration
public class CxfConfig {
@Autowired
private Bus bus;
@Autowired
IUserService userService;
/**
* 此方法作用是改变项目中服务名的前缀名,此处127.0.0.1或者localhost不能访问时,请使用ipconfig查看本机ip来访问
* 此方法被注释后:wsdl访问地址为http://127.0.0.1:8080/services/user?wsdl
* 去掉注释后:wsdl访问地址为:http://127.0.0.1:8080/soap/user?wsdl
*
* @return
*/
@Bean
public ServletRegistrationBean disServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new CXFServlet(), "/UserServiceImpi/*");
return servletRegistrationBean;
}
@Bean(name = Bus.DEFAULT_BUS_ID)
public SpringBus springBus() {
return new SpringBus();
}
/** JAX-WS
* 站点服务
* **/
@Bean
public Endpoint endpoint() {
EndpointImpl endpoint = new EndpointImpl(bus, userService);
endpoint.publish("/ces");
return endpoint;
}
}
访问 http://127.0.0.1:服务端口/UserServiceImpi/ces?wsdl
该请求是可以获取得到wsdl文档的
http://127.0.0.1:服务端口/UserServiceImpi 即可访问到你发布的webService服务提供的接口。
总结
本人使用的是springboot+webService实现的,也存在其他办法实现,在此不做过多的介绍,大致流程基本一致,需要掌握的知识点:wsdl+soapui+webService+cxf+springboot+以及jdk的wsimport命令。