webservice 服务端例子+客户端例子+CXF整合spring服务端测试+生成wsdl文件 +cxf客户端代码自动生成
首先到CXF官网及spring官网下载相关jar架包,这个不多说。webservice是干嘛用的也不多说。
入门例子
模拟新增一个用户,并返回新增结果,成功还是失败。
大概的目录如上,很简单。
ResultInfo.java
- package com.fei.webservice.user.bean;
- import java.text.MessageFormat;
- import javax.xml.bind.annotation.XmlAccessorType;
- import javax.xml.bind.annotation.XmlAttribute;
- import javax.xml.bind.annotation.XmlType;
- import javax.xml.bind.annotation.XmlAccessType;
- @XmlAccessorType(XmlAccessType.FIELD)
- @XmlType(name = "ResultInfo", namespace = "http://bean.user.webservice.fei.com/")
- public class ResultInfo {
- @XmlAttribute(required = true)
- private String code;
- @XmlAttribute
- private String message;
- public ResultInfo(){
- super();
- }
- public ResultInfo(String code,String message){
- super();
- this.code = code;
- this.message = message;
- }
- public String getCode() {
- return code;
- }
- public String getMessage() {
- return message;
- }
- public void setCode(String code) {
- this.code = code;
- }
- public void setMessage(String message) {
- this.message = message;
- }
- @Override
- public String toString() {
- return MessageFormat
- .format("[code={0},message={1}]",
- code,
- message);
- }
- }
IUserService.java
- package com.fei.webservice.user;
- import javax.jws.WebParam;
- import javax.jws.WebService;
- import com.fei.webservice.user.bean.ResultInfo;
- @WebService
- public interface IUserService {
- ResultInfo createUser(
- @WebParam(name = "name") String name,
- @WebParam(name = "password") String password);
- }
UserService.java
- package com.fei.webservice.user;
- import javax.jws.WebService;
- import com.fei.webservice.user.bean.ResultInfo;
- @WebService(
- endpointInterface = "com.fei.webservice.user.IUserService",
- targetNamespace = "http://user.webservice.fei.com/",
- serviceName = "IUserService")
- public class UserService implements IUserService{
- public final String SUCCESS = "0000";
- public final String FAIL = "1001";
- @Override
- public ResultInfo createUser(String name, String password) {
- //做业务
- System.out.println("新增用户:name="+name+",password="+password);
- //通知第三方操作结果
- return new ResultInfo(SUCCESS,"用户新增成功!");
- }
- }
ServerStart.java
- package com.fei;
- import javax.xml.ws.Endpoint;
- import com.fei.webservice.user.UserService;
- public class ServerStart {
- public static void deployService() {
- System.out.println("Server start ……");
- UserService service = new UserService();
- String address = "http://localhost:9000/userService";
- Endpoint.publish(address, service);
- }
- public static void main(String[] args) throws InterruptedException {
- //发布WebService
- deployService();
- System.out.println("server ready ……");
- }
- }
ServerStart.java是用来发布接口的,可以理解为像tomcat那样启动后,浏览器就可以访问了。
ClientTest.java
- package com.fei;
- import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
- import com.fei.webservice.user.IUserService;
- public class ClientTest {
- public static void main(String[] args) {
- //调用WebService
- JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
- factory.setServiceClass(IUserService.class);
- factory.setAddress("http://localhost:9000/userService");
- IUserService service = (IUserService) factory.create();
- System.out.println("[result]" + service.createUser("张三", "1111"));
- }
- }
ClientTest.java模拟第三方调用接口。也就是对服务端(ServerStart.java启动的那个)是否成功,客户端和服务端的通讯是否OK。
执行ServerStart.java,看到这样的信息:
启动OK。接下来,用浏览器访问,看看是否有xml格式的内容。
访问地址:http://localhost:9000/userService?wsdl
好了,服务端OK了,我们用客户端来调用服务端的接口,看看效果。
测试方法一:
执行ClientTest.java,控制台显示如下信息:
可以看到服务端返回了一个结果对象ResultInfo给客户端,告诉客户服务端新增用户成功了。
测试方法二
使用SOUP-UI来测试,自己网上下载。
CXF整合spring
在WEB-INF下新增一个spring-cxf.xml文件(和web.xml同目录)。
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:jaxws="http://cxf.apache.org/jaxws"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
- <import resource="classpath:META-INF/cxf/cxf.xml" />
- <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
- <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
- <jaxws:endpoint id="userService"
- implementor="com.fei.webservice.user.UserService"
- address="/userService" />
- </beans>
web.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="3.0"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/spring-cxf.xml</param-value>
- </context-param>
- <listener>
- <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
- </listener>
- <servlet>
- <servlet-name>CXFServlet</servlet-name>
- <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>CXFServlet</servlet-name>
- <url-pattern>/cxf/*</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>index.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
将项目部署到tomcat下,启动tomcat。
浏览器访问:http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl
测试也有2种方法,和上面一样,只是改变访问地址而已,这里就不重复了。
生成wsdl文件
服务端代码完成,并发布之后,我们需要将接口的信息生成一个wsdl文件,给第三方,第三方拿到wsdl文件后,通过工具生成代码。
方法一:
最方便,最快捷的办法。服务端启动后,浏览器访问时,得到的信息,将网页另存为,文件的后缀用.wsdl,这样就得到wsdl文件了。
注意:用这种方法,浏览器使用IE,本人试过百度浏览器,360浏览器,网页另存时,它会将一些html的标签也搞出来了。wsdl文件是一个xml格式的文件。
推荐使用方法一,方法二生成的wsdl文件有点问题,不知道是工具的问题还是代码写漏了哪些注解配置。
方法二:
使用cxf的java2wsdl.bat工具来生成。
简单点的:
将classes文件下的com全部copy到cxf工具的bin目录下。cmd打开DOS窗口切换到bin目录下,然后使用命令
java2wsdl -cp ./com com.fei.webservice.user.IUserService
自动生成了IUserServiceService.wsdl文件。
麻烦点的:
1.打包,将代码打包成jar
在桌面上生成一个userservice.jar包,把该包copy到java2wsdl.bat的同目录下.cmd开打DOS窗口,切换到java2wsdl.bat目录下。执行命令:
java2wsdl -cp .\userservice.jar com.fei.webservice.user.IUserService
然后在目录下,会生成一个IUserService.wsdl文件。
验证wsdl文件
生成了wsdl文件,交给第三方之前,最好验证一下,使用它能否正确生成代码。
1.
用记事本或者浏览器打开查看wsdl文件,拉到最后,看看wsdl:port name那里是否和通过
http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl访问得到的一致。
上面介绍wsdl文件的生成用了2中方法。方法一通过IE浏览器的另存为得到wsdl文件,我命名为userService.wsdl.方法二通过java2wsdl自动生成的wsdl文件为IUserServiceService.wsdl.
查看userService.wsdl
上面红色框圈住的部分是我们期待的。
接下来查看IUserServiceService.wsdl文件
发现居然不是我们期待的,本人暂时找不到原因,为何导致这样。我们就暂时使用方法一来生成wsdl文件吧
2.
通过wsdl2java.bat工具,生成客户端源码,看看能否正确生成。
cmd打开DOS窗口,切换到wsdl2java.bat目录下,使用命令:
wsdl2java -client -server -impl .\userService.wsdl
在同目录下,会生成代码
为了方便,查看生成的代码的结构,我新建一个java项目,把新生成的代码copy进去。
我们来看看图上用箭头指向的那个类。
- package com.fei.webservice.user;
- import java.net.MalformedURLException;
- import java.net.URL;
- import javax.xml.namespace.QName;
- import javax.xml.ws.Service;
- import javax.xml.ws.WebEndpoint;
- import javax.xml.ws.WebServiceClient;
- import com.fei.webservice.user.IUserService;
- /**
- * This class was generated by Apache CXF (incubator) 2.0.4-incubator
- * Sat Jun 28 15:05:37 CST 2014
- * Generated source version: 2.0.4-incubator
- *
- */
- @WebServiceClient(name = "IUserService", targetNamespace = "http://user.webservice.fei.com/", wsdlLocation = "file:./userService.wsdl")
- public class IUserService_Service extends Service {
- public final static URL WSDL_LOCATION;
- public final static QName SERVICE = new QName("http://user.webservice.fei.com/", "IUserService");
- public final static QName UserServicePort = new QName("http://user.webservice.fei.com/", "UserServicePort");
- static {
- URL url = null;
- try {
- url = new URL("file:./userService.wsdl");
- } catch (MalformedURLException e) {
- System.err.println("Can not initialize the default wsdl from file:./userService.wsdl");
- // e.printStackTrace();
- }
- WSDL_LOCATION = url;
- }
- public IUserService_Service(URL wsdlLocation) {
- super(wsdlLocation, SERVICE);
- }
- public IUserService_Service(URL wsdlLocation, QName serviceName) {
- super(wsdlLocation, serviceName);
- }
- public IUserService_Service() {
- super(WSDL_LOCATION, SERVICE);
- }
- /**
- *
- * @return
- * returns UserServicePort
- */
- @WebEndpoint(name = "UserServicePort")
- public IUserService getUserServicePort() {
- return (IUserService)super.getPort(UserServicePort, IUserService.class);
- }
- }
看到了吗?
@WebServiceClient(name = "IUserService", targetNamespace = "http://user.webservice.fei.com/"
@WebEndpoint(name = "UserServicePort")
特别是UserServicePort一定要和用浏览器访问服务端时界面显示的那个一样(上面截图中用红色框圈住的那个wsdl:port name = "UserServicePort")
验证wsdl生成的代码是否可用
把wsdl文件给第三方之前,一定要确保wsdl文件是没问题的,生成出来的代码也是OK的。所以把wsdl文件给第三方之前还有最后一步要做。验证wsdl生成的代码是否可用.
看到上面给的目录结构图了吗?我新曾了org.fei.service.UserService.java以及UserServiceTest.java
UserService.java
- package org.fei.service;
- import java.net.URL;
- import com.fei.webservice.user.IUserService;
- import com.fei.webservice.user.IUserService_Service;
- import com.fei.webservice.user.bean.ResultInfo;
- public class UserService {
- private final static String _URL = "http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl";
- //wsdl生成的接口
- private IUserService userService;
- public UserService() {
- try {
- userService = new IUserService_Service(new URL(_URL)).getUserServicePort();
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException("用户接口初始化连接出错!",e);
- }
- }
- public boolean addUser(String name,String password){
- boolean isSuccess = false;
- try {
- ResultInfo result = userService.createUser(name, password);
- if("0000".equals(result.getCode())){
- isSuccess = true;
- System.out.println("新增用户操作结果:成功!");
- }else{
- isSuccess = false;
- System.out.println("新增用户操作结果:失败!");
- }
- } catch (Exception e) {
- e.printStackTrace();
- isSuccess = false;
- }
- return isSuccess;
- }
- }
UserServiceTest.java
- package org.fei.service;
- public class UserServiceTest {
- public static void main(String[] args) {
- UserService userService = new UserService();
- userService.addUser("张三", "123");
- }
- }
把服务端tomcat启动,然后执行UserServiceTest.java看到运行结果:
到这一步,就可以放心把wsdl文件给对方了。
作为服务端,我们需要把wsdl文件给第三方,并告知我们的访问地址,如本例访问地址:http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl
原文:http://blog.csdn.net/dream_broken/article/details/35331949
附:cxf生成webservice客户端
使用步骤如下:
一、下载apache cxf的包,如apache-cxf-2.7.10.zip,地址:cxf.apache.org/download.html
二、解压apache-cxf-2.7.10.zip至某一目录,如D:\apache-cxf-2.7.10
三、设置环境变量
1、CXF_HOME=D:\apache-cxf-2.7.10
2、在path后面加上 %CXF_HOME%/bin;
在cmd命令中输入wsdl2java,如果有提示usage,就表明配置成功
四、运行wsdl2java工具
在cmd命令中输入:wsdl2java -d D:\\src -client http://api.xxx.cn/xxxAPI/service/auditResBatchQueryService?wsdl
(D:\\src 是客户端程序代码所在的目录,http://api.xxx.cn/xxxAPI/service/auditResBatchQueryService?wsdl 是 定义webservice的地址)
附wsdl2java用法:
wsdl2java -p com -d D:\\src -all xx.wsdl
-p 指定其wsdl的命名空间,也就是要生成代码的包名:
-d 指定要产生代码所在目录
-client 生成客户端测试web service的代码
-server 生成服务器启动web service的代码
-impl 生成web service的实现代码
-ant 生成build.xml文件
-all 生成所有开始端点代码:types,service proxy,,service interface, server mainline, client mainline, implementation object, and an Ant build.xml file.
实例:
wsdl2java -p com.wz.interfaces.wsclient -d D:\project\src -client d:\ws\serviceInteface.wsdl
webservice 服务端例子+客户端例子+CXF整合spring服务端测试+生成wsdl文件 +cxf客户端代码自动生成的更多相关文章
- 根据wsdl文件,Web工程自动生成webservice客户端调用
根据wsdl文件,Web工程自动生成webservice客户端调用 1,工具:带有webservice插件的eclips 2,步骤: (1),新建一个Web工程:WSDLTest (2),浏览器访问W ...
- 根据wsdl文件,Java工程自动生成webservice客户端调用
根据wsdl文件,Java工程自动生成webservice客户端调用 1,工具:带有webservice插件的myeclips 2,步骤: (1),新建一个Java工程:relationship (2 ...
- 【WebService】——CXF整合Spring
相关博客: [WebService]--入门实例 [WebService]--SOAP.WSDL和UDDI 前言: 之前的几篇博客基本上都是使用jdk来实现WebService的调用,没有使用任何框架 ...
- CXF整合Spring开发WebService
刚开始学webservice时就听说了cxf,一直没有尝试过,这两天试了一下,还不错,总结如下: 要使用cxf当然是要先去apache下载cxf,下载完成之后,先要配置环境变量,有以下三步: 1.打开 ...
- WebService—CXF整合Spring实现接口发布和调用过程
一.CXF整合Spring实现接口发布 发布过程如下: 1.引入jar包(基于maven管理) <!-- cxf --> <dependency> <groupId> ...
- CXF整合Spring发布WebService实例
一.说明: 上一篇简单介绍了CXF以及如何使用CXF来发布一个简单的WebService服务,并且介绍了客户端的调用. 这一篇介绍如何使用CXF与spring在Web项目中来发布WebService服 ...
- 【Java EE 学习 81】【CXF框架】【CXF整合Spring】
一.CXF简介 CXF是Apache公司下的项目,CXF=Celtix+Xfire:它支持soap1.1.soap1.2,而且能够和spring进行快速无缝整合. 另外jax-ws是Sun公司发布的一 ...
- CXF整合Spring之JaxWsProxyFactoryBean调用
1.见解 1.1 客户端的接口代码还一定要和服务端的接口代码一样,连注解都要一样,不够灵活 1.2 当客户端访问服务器的请求地址时,如果服务端没有对应的地址,就会报错,但是又没有cxf的异常捕获处理 ...
- cxf整合spring错误为:cvc-complex-type.2.4.c
cxf整合spring,报错信息如下: Multiple annotations found at this line:- cvc-complex-type.2.4.c: The matching w ...
随机推荐
- python 学习笔记6(数据库 sqlite)
26. SQLite 轻量级的关系型数据库 SQLite是python自带的数据库,可以搭配python存储数据,开发网站等. 标准库中的 sqlite3 提供该数据库的接口. 1. 基本语法如下 c ...
- bzoj 1208 splay模板题2
自己yy了找前驱和后继,学了学怎么删除...(反正就是练模板) #include<iostream> #include<cstdio> #include<cstring& ...
- 【BZOJ-4422】Cow Confinement 线段树 + 扫描线 + 差分 (优化DP)
4422: [Cerc2015]Cow Confinement Time Limit: 50 Sec Memory Limit: 512 MBSubmit: 61 Solved: 26[Submi ...
- 【BZOJ-2453&2120】维护队列&数颜色 分块 + 带修莫队算法
2453: 维护队列 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 653 Solved: 283[Submit][Status][Discuss] ...
- Android成长日记-Android监听事件的方法
1. Button鼠标点击的监听事件 --setOnClickListener 2. CheckBox, ToggleButton , RadioGroup的改变事件 --setOnCheckedCh ...
- nginx中SSI问题的研究
最近感觉挺爽的,这个项目团队没有一个专门做PHP的,我是第一个进来做PHP(当然还有前端)的,哈哈,我会设计修改出适合我们业务的PHP框架,哈哈,感觉会学到很多东西的样子,前几天在组内20几个前辈面前 ...
- Python 简介和入门
1.Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC ...
- HDU #5733 tetrahedron
tetrahedron 传送门 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) P ...
- AngularJs ngInclude、ngTransclude
这两个都是HTML DOM嵌入指令 ngInclude 读取,编译和插入外部的HTML片段. 格式:ng-include=“value”<ng-include src=”value” onloa ...
- AngularJs ngApp、ngBind、ngBindHtml、ngNonBindable
ngApp 使用这个指令自动启动一个AngularJS应用.ngApp指令指定了应用程序的根节点,通常会将ngApp放置在网页的根节点如<body>或<html >标签的. 格 ...