基于WSDL契约优先的web services服务器端和客户端开发方式
?
(6)??? Output Directory中选择src位置(支持Maven项目),Package Name中填写包路径,选择Finish;
?
(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服务器端和客户端代码更方便快捷。
?
?
?
?