CXF实现webService服务

一、背景

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对象之间在服务端以及客户端的互转比较消耗性能)
  2. 目前java主流的webService应用以CXF、AXIS2为主;
  3. 通过网络渠道的了解,目前CXF的效率要比AXIS2高出至少50%;
  4. 另外有一个webService的工具metro的效率比CXF高出10%;
  5. CXF的实现资料网上可以随便找出一大堆,metro的资料相对少一些;
  6. 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服务(一)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 判断监听系统网络状态

    麦克劳林
  • Maven项目Spring整合RocketMQ消费者实现

    RocketMQ是阿里巴巴在2012年开源的分布式消息中间件,目前已经捐赠给Apache基金会,已经于2016年11月成为 Apache 孵化项目,相信Rock...

    麦克劳林
  • 用MINA实现UDP通信的例子

    Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP、UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象...

    麦克劳林
  • Java反射——框架设计的灵魂

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对...

    100000860378
  • Python+java+websocket+SpringMVC实时监控数据库中的表

    做数据展示你可能会想到ajax,做实时数据展示你可能会想到定时器+ajax。 定时器+ajax可能会造成:如果到一个指定的时间点没有新数据的话会造成一定的资源...

    TrueDei
  • YAML

    SpringBoot支持使用一个全局的配置配置文件,目录在src/main/resources或者类路径/config,全局配置文件可以对一些默认配置值进行修改...

    桑鱼
  • SpringCloud的入门学习之Eureka(高可用注册中心HA)构建Provider服务、Consumer服务

      使用springboot的多环境配置,来搭建Eureka的高可用集群式部署。由于使用的是maven构建的springboot项目,所以首先引入pom.xml...

    别先生
  • 【设计模式-门面模式】

    学校的学生信息相关系统大家都用过,比如门户网、教务系统、图书管理系统等,一般需要用到某个系统,需要单独去登录,比如同时想去门户网和教务系统查询信息,需要在两个网...

    Liusy
  • 三星为爱美人士操碎了心,新专利用手机检测晒黑指数帮你防晒! | 热点

    三星新专利可以通过手机前置摄像头检测皮肤的损伤以及晒黑的程度,并且能够通过APP给消费者提供防晒建议。

    镁客网
  • Java并发-定义锁以及消费者-生产者模式实现

     对于Java并发的锁结构,我们常常使用的是synchonized结构,而由于其灵活度较低,所以在Java-5后提出了Lock接口,以及AbstractQueu...

    Fisherman渔夫

扫码关注云+社区

领取腾讯云代金券