CXF实现webService服务

作者: 麦克劳林 | 来源:发表于2017-07-25 14:03 被阅读736次

    一、背景

    WebService基本概念

    Web Service也叫XML Web Service,WebService是一种可以接收从Internet或者Internet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。

    XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。

    Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。

    WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。

    UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。

    自己按照网上参考搭建了一遍CXF环境。过程中也有遇到的问题,也做了简单的整理。
    对于CXF是干什么用的,我不想多说,大家都知道这是我们在Java编程中webService技术的一种实现工具。我们说说为什么用CXF来实现webService:

    1.  Java的webService实现本身就是一个很耗性能的实现方案(xml与java对象之间在服务端以及客户端的互转比较消耗性能)
      
    1.  目前java主流的webService应用以CXF、AXIS2为主;
      
    2.  通过网络渠道的了解,目前CXF的效率要比AXIS2高出至少50%;
      
    3.  另外有一个webService的工具metro的效率比CXF高出10%;
      
    4.  CXF的实现资料网上可以随便找出一大堆,metro的资料相对少一些;
      
    5.  CXF在java应用实现中已经很成熟,企业更倾向于用这样一个成熟的解决方案;
      

    基于以上原因,我选择CXF来实现webService。

    二、 以annotation注解方式实现发布webService应用

    首先先建好Web Service工程如下:

    1.png 点击finish创建完成

    下图是我配置完成后的整个工程目录,这是我们接下来的目标:

    工程目录

    1、 基础环境

    新建java web工程cxf之后,下载cxf工具包。解压CXF之后,把cxf工具包lib下的jar包全部放到工程的lib下。
    此处用到的cxf工具包版本为:apache-cxf-3.1.12(我选择的是3.1.12的,大家可以参考,我选择的是最高版本的)
    下载地址:http://cxf.apache.org/download.html

    2、 编写服务接口

    见文件HelloWorld.java

    package com.cetc50.server;
    import java.util.List;
    import javax.jws.WebParam;
    import javax.jws.WebService;
    import com.cetc50.user.User;
    @WebService
    public interface HelloWorld {
        String sayHi(@WebParam(name="text")String text);
        String sayHiToUser(User user);
        String[] SayHiToUserList(List<User> userList);
    }
    

    3、 服务接口实现

    见文件HelloWorldImpl.java

    package com.cetc50.server;
    import java.util.LinkedHashMap;  
    import java.util.List;  
    import java.util.Map;    
    import javax.jws.WebParam;  
    import javax.jws.WebService;
    import com.cetc50.user.User;
    
    @WebService(endpointInterface="com.cetc50.server.HelloWorld",serviceName="HelloWorld")  
    public class HelloWorldImpl implements HelloWorld {  
        Map<Integer, User> users = new LinkedHashMap<Integer, User>();    
        public String sayHi(@WebParam(name = "text") String text) {  
            return "Hello,"+text;  
        }    
        public String sayHiToUser(User user) {  
            users.put(users.size()+1, user);  
            return "Hello,"+user.getName();  
        }   
        public String[] SayHiToUserList(List<User> userList) {  
            String[] result = new String[userList.size()];  
            int i = 0;  
            for(User u:userList){  
                result[i] = "Hello " + u.getName();  
                i++;  
            }  
            return result;  
        }    
    } 
    

    4、 发布服务app

    见文件webServiceApp.java

    package com.cetc50.server;
    import javax.xml.ws.Endpoint;
    
    public class webServiceApp {
        public static void main(String[] args) {
            System.out.println("web service start");
            HelloWorldImpl implementor= new HelloWorldImpl();
            String address="http://localhost:8080/helloWorld";
            Endpoint.publish(address, implementor);
            System.out.println("web service started");
        }
    }
    

    选中webServiceApp.java,右键 Run As 选择Java Application发布服务;然后在浏览器输入地址:http://localhost:8080/helloWorld?wsdl
    出现下图说明webService服务发布成功。

    webService服务发布成功。

    问题来了:

    刚开始按照网上参考步骤做了,结果在发布时出现如下很长一串英文错误:DefaultValidationEventHandler: [ERROR]: prefix wsdp is not bound to a namespace
    Location: node: [wsd:Types: null]
    解决办法:经过在网上查阅是因为我在引入CXF的jar包时,全加进去了,在lib中找到如下四个jar包,删除即可。


    再次选中webServiceApp.java,右键 Run As 选择Java Application发布服务;然后在浏览器输入地址:http://localhost:8080/helloWorld?wsdl , 就会露出喜悦的表情,嘿嘿嘿!!!

    5、 客户端访问服务

    见文件HelloWorldClient.java

    package com.cetc50.client;
    import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; 
    import com.cetc50.server.HelloWorld;  
    import com.cetc50.user.User;
    
    public class HelloWorldClient {   
        public static void main(String[] args) {            
            //首先右键run as 运行com.cetc50.server.webServiceApp类,然后再运行这段客户端代码  
            JaxWsProxyFactoryBean jwpfb = new JaxWsProxyFactoryBean();  
            jwpfb.setServiceClass(HelloWorld.class);  
            jwpfb.setAddress("http://localhost:8080/helloWorld");  
            HelloWorld hw = (HelloWorld) jwpfb.create();  
            User user = new User();  
            user.setName("马克思");  
            user.setDescription("怀念马克思");  
            System.out.println(hw.sayHiToUser(user));            
        }   
    } 
    

    选中HelloWorldClient.java,右键 Run As 选择Java Application运行,控制台会打印如下图:

    客户端访问也成功啦

    6、 不能忘记了User.java文件

    package com.cetc50.user;
    import java.io.Serializable;  
    
    @SuppressWarnings("serial")  
    public class User implements Serializable {  
    
        private String id;  
        private String name;  
        private String age;  
        private String description;  
      
        public User() {  
            super();  
        }  
    
        public String getId() {  
            return id;  
        }  
    
        public void setId(String id) {  
            this.id = id;  
        }  
    
        public String getName() {  
            return name;  
        }  
    
        public void setName(String name) {  
            this.name = name;  
        }  
    
        public String getAge() {  
            return age;  
        }  
    
        public void setAge(String age) {  
            this.age = age;  
        }  
    
        public String getDescription() {  
            return description;  
        }  
    
        public void setDescription(String description) {  
            this.description = description;  
        }      
    }  
    

    此篇实现了webService服务的发布以及在本工程下的客户端调用服务的示例并不是很直观,欢迎学习和指导。
    本文参照了:CXF实现webService服务(一)

    相关文章

      网友评论

        本文标题:CXF实现webService服务

        本文链接:https://www.haomeiwen.com/subject/yluwkxtx.html