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


    首先到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:projectsrc -client d:wsserviceInteface.wsdl
  • 相关阅读:
    Java 8实战之读书笔记五:超越Java 8
    Quartz的简单使用
    Quartz实现数据库动态配置定时任务
    Java解析Groovy和Shell的代码
    Spring学习笔记(3)——快速入门
    linux的防火墙端口配置
    气泡提示 纯CSS
    解决LINUX下SQLPLUS时上下左右键乱码问题
    redhat Enterprise Linux 6 VNC安装
    使用mount命令挂载CDROM
  • 原文地址:https://www.cnblogs.com/langtianya/p/4929846.html
Copyright © 2020-2023  润新知