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 条评论
登录 后参与评论

相关文章

来自专栏JAVA高级架构

Netty原理浅析

Netty是JBoss出品的高效的Java NIO开发框架。本文将主要分析Netty实现方面的东西,由于精力有限,本人并没有对其源码做了极细致的研 究。如果下面...

12320
来自专栏java达人

java 处理xml的三种技术

最初,XML 语言仅仅是意图用来作为 HTML 语言的替代品而出现的,但是随着该语言的不断发展和完善,人们越来越发现它所具有的优点:例如标记语言可扩...

25850
来自专栏Java架构师历程

solr

Solr它是一种开放源码的、基于 Lucene Java 的搜索服务器,易于加入到 Web 应用程序中。Solr 提供了层面搜索(就是统计)、命中醒目显示并且支...

48720
来自专栏Kubernetes

深度解析Kubernetes Local Persistent Volume(二)

摘要:上一篇博客”深度解析Kubernetes Local Persistent Volume(一)“对local volume的基本原理和注意事项进行了分析,...

1.7K30
来自专栏架构师之旅

《Spring敲门砖之基础教程第一季》 第二章(1) Spring框架之IOC首例-HelloWorld

回顾 上一章我们主要学习了Spring的一些理论知识,对Spring框架有了一个总体的概括,大家应该在头脑里形成一个初步的印象,接下来我们就会针对Spring框...

205100
来自专栏编舟记

一步步编写SonarQube Plugin

插件确实不好写,因为插件是插入庞大的系统当中工作的,那也就意味着写插件需要具备一定的领域知识,包括系统架构、扩展点、业务共性及差异、API及其业务模型对应、安装...

89330
来自专栏JavaEE

Java调用微信登录以及eclipse 远程调试前言:一、微信测试号的连接与申请:二、eclipse远程调试:总结:

35750
来自专栏along的开发之旅

图解JSP运行原理和过程

下面代码通过注解来处理/hello的请求, 并在代码中将请求转发到上述hello.jsp.

12610
来自专栏林冠宏的技术文章

关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。

( 转载请务必标明出处:https://cloud.tencent.com/developer/user/1148436/activities) 前序 本文将...

34750
来自专栏吉浦迅科技

DAY71:阅读Device-side Launch from PTX

我们正带领大家开始阅读英文的《CUDA C Programming Guide》,今天是第71天,我们正在讲解CUDA 动态并行,希望在接下来的30天里,您可以...

12920

扫码关注云+社区

领取腾讯云代金券