webservice 服务端例子+客户端例子+CXF整合spring服务端测试+生成wsdl文件 +cxf客户端代码自动生成

来源:互联网 发布:java bit operation 编辑:程序博客网 时间:2024/05/16 16:23

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

门例子

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


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

ResultInfo.java

 

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


IUserService.java

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

UserService.java

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



ServerStart.java

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

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

ClientTest.java

 

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

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.    
  10.     <import resource="classpath:META-INF/cxf/cxf.xml" />  
  11.     <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />  
  12.     <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  
  13.       
  14.     <jaxws:endpoint id="userService"  
  15.         implementor="com.fei.webservice.user.UserService"   
  16.         address="/userService" />  
  17. </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.     
  8.     
  9.   <context-param>    
  10.         <param-name>contextConfigLocation</param-name>    
  11.         <param-value>/WEB-INF/spring-cxf.xml</param-value>    
  12.     </context-param>    
  13.     <listener>    
  14.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>    
  15.     </listener>    
  16.     <servlet>    
  17.         <servlet-name>CXFServlet</servlet-name>    
  18.         <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>    
  19.         <load-on-startup>1</load-on-startup>    
  20.     </servlet>    
  21.     <servlet-mapping>    
  22.         <servlet-name>CXFServlet</servlet-name>    
  23.         <url-pattern>/cxf/*</url-pattern>    
  24.     </servlet-mapping>    
  25.     
  26.       
  27.   <welcome-file-list>  
  28.     <welcome-file>index.jsp</welcome-file>  
  29.   </welcome-file-list>  
  30. </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.   
  3. import java.net.MalformedURLException;  
  4. import java.net.URL;  
  5. import javax.xml.namespace.QName;  
  6. import javax.xml.ws.Service;  
  7. import javax.xml.ws.WebEndpoint;  
  8. import javax.xml.ws.WebServiceClient;  
  9. import com.fei.webservice.user.IUserService;  
  10.   
  11. /** 
  12.  * This class was generated by Apache CXF (incubator) 2.0.4-incubator 
  13.  * Sat Jun 28 15:05:37 CST 2014 
  14.  * Generated source version: 2.0.4-incubator 
  15.  *  
  16.  */  
  17.   
  18. @WebServiceClient(name = "IUserService", targetNamespace = "http://user.webservice.fei.com/", wsdlLocation = "file:./userService.wsdl")  
  19. public class IUserService_Service extends Service {  
  20.   
  21.     public final static URL WSDL_LOCATION;  
  22.     public final static QName SERVICE = new QName("http://user.webservice.fei.com/", "IUserService");  
  23.     public final static QName UserServicePort = new QName("http://user.webservice.fei.com/", "UserServicePort");  
  24.     static {  
  25.         URL url = null;  
  26.         try {  
  27.             url = new URL("file:./userService.wsdl");  
  28.         } catch (MalformedURLException e) {  
  29.             System.err.println("Can not initialize the default wsdl from file:./userService.wsdl");  
  30.             // e.printStackTrace();  
  31.         }  
  32.         WSDL_LOCATION = url;  
  33.     }  
  34.   
  35.     public IUserService_Service(URL wsdlLocation) {  
  36.         super(wsdlLocation, SERVICE);  
  37.     }  
  38.   
  39.     public IUserService_Service(URL wsdlLocation, QName serviceName) {  
  40.         super(wsdlLocation, serviceName);  
  41.     }  
  42.   
  43.     public IUserService_Service() {  
  44.         super(WSDL_LOCATION, SERVICE);  
  45.     }  
  46.   
  47.     /** 
  48.      *  
  49.      * @return 
  50.      *     returns UserServicePort 
  51.      */  
  52.     @WebEndpoint(name = "UserServicePort")  
  53.     public IUserService getUserServicePort() {  
  54.         return (IUserService)super.getPort(UserServicePort, IUserService.class);  
  55.     }  
  56.   
  57. }  


    看到了吗?

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


UserServiceTest.java

 

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


把服务端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
0 0
原创粉丝点击