首先到CXF官网及spring官网下载相关jar架包,这个不多说。webservice是干嘛用的也不多说。

入门例子

模拟新增一个用户,并返回新增结果,成功还是失败。

大概的目录如上,很简单。

ResultInfo.java

  1. package com.fei.webservice.user.bean;
  2. import java.text.MessageFormat;
  3. import javax.xml.bind.annotation.XmlAccessorType;
  4. import javax.xml.bind.annotation.XmlAttribute;
  5. import javax.xml.bind.annotation.XmlType;
  6. import javax.xml.bind.annotation.XmlAccessType;
  7. @XmlAccessorType(XmlAccessType.FIELD)
  8. @XmlType(name = "ResultInfo", namespace = "http://bean.user.webservice.fei.com/")
  9. public class ResultInfo {
  10. @XmlAttribute(required = true)
  11. private String code;
  12. @XmlAttribute
  13. private String message;
  14. public ResultInfo(){
  15. super();
  16. }
  17. public ResultInfo(String code,String message){
  18. super();
  19. this.code = code;
  20. this.message = message;
  21. }
  22. public String getCode() {
  23. return code;
  24. }
  25. public String getMessage() {
  26. return message;
  27. }
  28. public void setCode(String code) {
  29. this.code = code;
  30. }
  31. public void setMessage(String message) {
  32. this.message = message;
  33. }
  34. @Override
  35. public String toString() {
  36. return MessageFormat
  37. .format("[code={0},message={1}]",
  38. code,
  39. message);
  40. }
  41. }

IUserService.java

  1. package com.fei.webservice.user;
  2. import javax.jws.WebParam;
  3. import javax.jws.WebService;
  4. import com.fei.webservice.user.bean.ResultInfo;
  5. @WebService
  6. public interface IUserService {
  7. ResultInfo createUser(
  8. @WebParam(name = "name") String name,
  9. @WebParam(name = "password") String password);
  10. }

UserService.java

  1. package com.fei.webservice.user;
  2. import javax.jws.WebService;
  3. import com.fei.webservice.user.bean.ResultInfo;
  4. @WebService(
  5. endpointInterface = "com.fei.webservice.user.IUserService",
  6. targetNamespace = "http://user.webservice.fei.com/",
  7. serviceName = "IUserService")
  8. public class UserService implements IUserService{
  9. public final String SUCCESS = "0000";
  10. public final String FAIL = "1001";
  11. @Override
  12. public ResultInfo createUser(String name, String password) {
  13. //做业务
  14. System.out.println("新增用户:name="+name+",password="+password);
  15. //通知第三方操作结果
  16. return new ResultInfo(SUCCESS,"用户新增成功!");
  17. }
  18. }

ServerStart.java

  1. package com.fei;
  2. import javax.xml.ws.Endpoint;
  3. import com.fei.webservice.user.UserService;
  4. public class ServerStart {
  5. public static void deployService() {
  6. System.out.println("Server start ……");
  7. UserService service = new UserService();
  8. String address = "http://localhost:9000/userService";
  9. Endpoint.publish(address, service);
  10. }
  11. public static void main(String[] args) throws InterruptedException {
  12. //发布WebService
  13. deployService();
  14. System.out.println("server ready ……");
  15. }
  16. }

ServerStart.java是用来发布接口的,可以理解为像tomcat那样启动后,浏览器就可以访问了。

ClientTest.java

  1. package com.fei;
  2. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  3. import com.fei.webservice.user.IUserService;
  4. public class ClientTest {
  5. public static void main(String[] args) {
  6. //调用WebService
  7. JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
  8. factory.setServiceClass(IUserService.class);
  9. factory.setAddress("http://localhost:9000/userService");
  10. IUserService service = (IUserService) factory.create();
  11. System.out.println("[result]" + service.createUser("张三", "1111"));
  12. }
  13. }

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同目录)。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:jaxws="http://cxf.apache.org/jaxws"
  5. xsi:schemaLocation="
  6. http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
  9. <import resource="classpath:META-INF/cxf/cxf.xml" />
  10. <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
  11. <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
  12. <jaxws:endpoint id="userService"
  13. implementor="com.fei.webservice.user.UserService"
  14. address="/userService" />
  15. </beans>

web.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app version="3.0"
  3. xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  6. http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  7. <context-param>
  8. <param-name>contextConfigLocation</param-name>
  9. <param-value>/WEB-INF/spring-cxf.xml</param-value>
  10. </context-param>
  11. <listener>
  12. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  13. </listener>
  14. <servlet>
  15. <servlet-name>CXFServlet</servlet-name>
  16. <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
  17. <load-on-startup>1</load-on-startup>
  18. </servlet>
  19. <servlet-mapping>
  20. <servlet-name>CXFServlet</servlet-name>
  21. <url-pattern>/cxf/*</url-pattern>
  22. </servlet-mapping>
  23. <welcome-file-list>
  24. <welcome-file>index.jsp</welcome-file>
  25. </welcome-file-list>
  26. </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进去。

我们来看看图上用箭头指向的那个类。

  1. package com.fei.webservice.user;
  2. import java.net.MalformedURLException;
  3. import java.net.URL;
  4. import javax.xml.namespace.QName;
  5. import javax.xml.ws.Service;
  6. import javax.xml.ws.WebEndpoint;
  7. import javax.xml.ws.WebServiceClient;
  8. import com.fei.webservice.user.IUserService;
  9. /**
  10. * This class was generated by Apache CXF (incubator) 2.0.4-incubator
  11. * Sat Jun 28 15:05:37 CST 2014
  12. * Generated source version: 2.0.4-incubator
  13. *
  14. */
  15. @WebServiceClient(name = "IUserService", targetNamespace = "http://user.webservice.fei.com/", wsdlLocation = "file:./userService.wsdl")
  16. public class IUserService_Service extends Service {
  17. public final static URL WSDL_LOCATION;
  18. public final static QName SERVICE = new QName("http://user.webservice.fei.com/", "IUserService");
  19. public final static QName UserServicePort = new QName("http://user.webservice.fei.com/", "UserServicePort");
  20. static {
  21. URL url = null;
  22. try {
  23. url = new URL("file:./userService.wsdl");
  24. } catch (MalformedURLException e) {
  25. System.err.println("Can not initialize the default wsdl from file:./userService.wsdl");
  26. // e.printStackTrace();
  27. }
  28. WSDL_LOCATION = url;
  29. }
  30. public IUserService_Service(URL wsdlLocation) {
  31. super(wsdlLocation, SERVICE);
  32. }
  33. public IUserService_Service(URL wsdlLocation, QName serviceName) {
  34. super(wsdlLocation, serviceName);
  35. }
  36. public IUserService_Service() {
  37. super(WSDL_LOCATION, SERVICE);
  38. }
  39. /**
  40. *
  41. * @return
  42. *     returns UserServicePort
  43. */
  44. @WebEndpoint(name = "UserServicePort")
  45. public IUserService getUserServicePort() {
  46. return (IUserService)super.getPort(UserServicePort, IUserService.class);
  47. }
  48. }

看到了吗?

@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

  1. package org.fei.service;
  2. import java.net.URL;
  3. import com.fei.webservice.user.IUserService;
  4. import com.fei.webservice.user.IUserService_Service;
  5. import com.fei.webservice.user.bean.ResultInfo;
  6. public class UserService {
  7. private final static String _URL = "http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl";
  8. //wsdl生成的接口
  9. private IUserService userService;
  10. public UserService()  {
  11. try {
  12. userService = new IUserService_Service(new URL(_URL)).getUserServicePort();
  13. } catch (Exception e) {
  14. e.printStackTrace();
  15. throw new RuntimeException("用户接口初始化连接出错!",e);
  16. }
  17. }
  18. public boolean addUser(String name,String password){
  19. boolean isSuccess = false;
  20. try {
  21. ResultInfo result = userService.createUser(name, password);
  22. if("0000".equals(result.getCode())){
  23. isSuccess = true;
  24. System.out.println("新增用户操作结果:成功!");
  25. }else{
  26. isSuccess = false;
  27. System.out.println("新增用户操作结果:失败!");
  28. }
  29. } catch (Exception e) {
  30. e.printStackTrace();
  31. isSuccess = false;
  32. }
  33. return isSuccess;
  34. }
  35. }

UserServiceTest.java

  1. package org.fei.service;
  2. public class UserServiceTest {
  3. public static void main(String[] args) {
  4. UserService userService = new UserService();
  5. userService.addUser("张三", "123");
  6. }
  7. }

把服务端tomcat启动,然后执行UserServiceTest.java看到运行结果:

到这一步,就可以放心把wsdl文件给对方了。

作为服务端,我们需要把wsdl文件给第三方,并告知我们的访问地址,如本例访问地址:http://localhost:8080/cxfwebserviceserver/cxf/userService?wsdl

例子源码下载

CXF代码生成wsdl,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客户端代码自动生成的更多相关文章

  1. 根据wsdl文件,Web工程自动生成webservice客户端调用

    根据wsdl文件,Web工程自动生成webservice客户端调用 1,工具:带有webservice插件的eclips 2,步骤: (1),新建一个Web工程:WSDLTest (2),浏览器访问W ...

  2. 根据wsdl文件,Java工程自动生成webservice客户端调用

    根据wsdl文件,Java工程自动生成webservice客户端调用 1,工具:带有webservice插件的myeclips 2,步骤: (1),新建一个Java工程:relationship (2 ...

  3. 【WebService】——CXF整合Spring

    相关博客: [WebService]--入门实例 [WebService]--SOAP.WSDL和UDDI 前言: 之前的几篇博客基本上都是使用jdk来实现WebService的调用,没有使用任何框架 ...

  4. CXF整合Spring开发WebService

    刚开始学webservice时就听说了cxf,一直没有尝试过,这两天试了一下,还不错,总结如下: 要使用cxf当然是要先去apache下载cxf,下载完成之后,先要配置环境变量,有以下三步: 1.打开 ...

  5. WebService—CXF整合Spring实现接口发布和调用过程

    一.CXF整合Spring实现接口发布 发布过程如下: 1.引入jar包(基于maven管理) <!-- cxf --> <dependency> <groupId> ...

  6. CXF整合Spring发布WebService实例

    一.说明: 上一篇简单介绍了CXF以及如何使用CXF来发布一个简单的WebService服务,并且介绍了客户端的调用. 这一篇介绍如何使用CXF与spring在Web项目中来发布WebService服 ...

  7. 【Java EE 学习 81】【CXF框架】【CXF整合Spring】

    一.CXF简介 CXF是Apache公司下的项目,CXF=Celtix+Xfire:它支持soap1.1.soap1.2,而且能够和spring进行快速无缝整合. 另外jax-ws是Sun公司发布的一 ...

  8. CXF整合Spring之JaxWsProxyFactoryBean调用

    1.见解 1.1 客户端的接口代码还一定要和服务端的接口代码一样,连注解都要一样,不够灵活 1.2 当客户端访问服务器的请求地址时,如果服务端没有对应的地址,就会报错,但是又没有cxf的异常捕获处理 ...

  9. 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 ...

随机推荐

  1. High购电商系统开发注意点

    1.引入第三方框架AFnetworking时,记得在xcode项目添加安全属性(自认为). 2.异步加载数据时,如果用数组来装模型,记得对数组进行初始化.对控件的赋值一般在获取数据之后.如果用到Tab ...

  2. Linux基础2

    命令格式命令的类型:1.内部命令 linux系统使用的shell提供.2.外部命令 安装第三方软件才会. type 命令名 查命令的类型 | 把前边命令的输出作为后边命令的输入 管道 grep 对数据 ...

  3. BZOJ 1109: [POI2007]堆积木Klo

    1109: [POI2007]堆积木Klo Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 948  Solved: 341[Submit][Statu ...

  4. 在Eclipse中如何关联spring-framework的文档和源代码

    1.到官方网站去下载spring-framework的jar包 spring-framework jar包的下载地址是:http://repo.spring.io/release/org/spring ...

  5. 【UOJ#33】【UR#2】树上GCD 有根树点分治 + 容斥原理 + 分块

    #33. [UR #2]树上GCD 有一棵$n$个结点的有根树$T$.结点编号为$1…n$,其中根结点为$1$. 树上每条边的长度为$1$.我们用$d(x,y)$表示结点$x,y$在树上的距离,$LC ...

  6. 【bzoj1500】 noi2005—维护数列

    http://www.lydsy.com/JudgeOnline/problem.php?id=1500 (题目链接) 题意 要求维护数列,操作有区间删除,区间插入,区间反转,区间修改,区间求和,求最 ...

  7. 09-FZ6R 白色

  8. ApsCMS AspCms_SettingFun.asp、AspCms-qqkfFun.asp、AspCms_Slide.asp、AspCms_StyleFun.asp、login.asp、AspCms_CommonFun.asp Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 AspCMS管理系统有较多漏洞,涉及到SQL注入.密码泄漏.后台写SHE ...

  9. 使用convert来批量处理图片

    这是个神奇的工具,居然使用命令行就可以这么方便的处理图片.功能有待挖掘. 这个是把图片批量进行 resize 的脚本. #!/bin/sh counter= root=mypict resolutio ...

  10. sublime编写markdown文件中Ctrl+B的作用

    今天,手残,用markdown编辑是按了Ctrl+B,结果发现直接在同一文件夹目录下编译生成了html文件,之前都是Alt+m,可以直接预览,可是后来由于系统更新还是什么,Alt+m只会在用户目录(而 ...