基于WSDL契约优先的web services服务器端和客户端开发方式
一. 通过Eclipse方式
1. 服务器端代码产生方式
(1) Eclipse(以下简称IDE)中创建一个普通的Java Project,或构建一个Maven管理的项目;
(2) 项目右键-Properties-Project Facets,勾选Dynamic Web Module,JAVA EE5对应2.5版本;
(3) 将已有的WSDL文件放在src下任意位置;
(4) 项目右键-New-Other-Web Service;
(5) Web service type选择Top down Java bean Web Service,Service definition选择WSDL文件,级别为最低的Develop,选择Next。
(6) Output Directory中选择src位置(支持Maven项目),Package Name中填写包路径,选择Finish;
2. 客户端产生方式
(1) 构建普通Java Project项目或在一个Maven项目中,设置Project Facets,并将WSDL放入项目目录下;
(2) 项目右键-New-Other-Web Service Client;
(3) Service definition选择WSDL文件,级别为最低的Develop,选择Next。
(4) Output Directory中选择src位置(支持Maven项目),Package Name中填写包路径,选择Finish;
3. 测试
(1) 服务器端可以采用CXF发布,或简单通过Endpoint发布。
(2) 客户端可以通过调用生成代码中已有的 ***_Client中Main方法进行调用;
二. 通过Maven中CXF插件
1. 添加CXF依赖及插件
(1) 在pom文件中加入以下依赖
<!-- cxf --> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxws</artifactId> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId> </dependency>
(2) 加入cxf插件,配置wsdl所在位置及代码生成存放位置
<!-- cxf wsdl2java 插件 --> <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>${cxf.version}</version> <configuration> <sourceRoot>${basedir}/target/generated-sources/cxf</sourceRoot> <wsdlOptions> <wsdlOption> <wsdl>${basedir}/src/main/resources/wsdl/soapservice.wsdl</wsdl> </wsdlOption> </wsdlOptions> </configuration> </plugin>
2. 生成接口编写实现
(1) 生成接口
执行 mvn cxf-codegen:wsdl2java,后在项目/target/generated-sources/cxf下会生成服务器端代码,将需要的Domain和服务端点接口(SEI)拷贝到项目中;
(2) 添加实现类实现SEI
添加SEI的实现类,并在该类上添加注解@WebService,参数如下:
serviceName 值与 SEI的@WebService注解中name属性值相同
targetNamespace值与 SEI的@WebService注解中targetNamespace属性值相同
endpointInterface 值为SEI的全限定名
如果需要配置记录他们的每一个日志消息可以在实现类上添加注解@Features
可以或Endpoint发布web services。
3. 通过Sping发布
(1) Web.xml
(2) Sping配置
(3) 启动
启动web项目访问XXX/cxf/ 可以看到wsdl地址如图,点击wsdl后的连接则可以看到wsdl文件内容
4. 客户端代码生成及访问
将通过执行mvn cxf-codegen:wsdl2java生成的代码全部拷贝至客户端项目中,创建main方法进行访问,方法如下:
三. 对比结果说明
两种方式从根本上来讲都是通过CXF中wsdl2java.exe的调用,但还是存在以下一些区别:
(1) 通过IDE生成的整体过程更简单,代码直接生成至指定包下;通过Maven插件需要手动拷贝文件;
(2) Maven生成的结果文件中,服务器端缺少SEI的实现类,客户端缺少调用SEI的实现类,而用IDE生成的情况下,这两个类全部存在。
综上,我认为通过IDE生成基于WSDL契约优先的web services服务器端和客户端代码更方便快捷。