前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CXF实现webService服务

CXF实现webService服务

作者头像
麦克劳林
发布2018-09-11 16:50:16
1.1K0
发布2018-09-11 16:50:16
举报
文章被收录于专栏:软件工程师成长笔记

一、背景

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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文件
代码语言:javascript
复制
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服务(一)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.07.25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、背景
    • WebService基本概念
    • 二、 以annotation注解方式实现发布webService应用
      • 1、 基础环境
        • 2、 编写服务接口
          • 3、 服务接口实现
            • 4、 发布服务app
              • 问题来了:
                • 5、 客户端访问服务
                  • 6、 不能忘记了User.java文件
                  相关产品与服务
                  微服务引擎 TSE
                  微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档