CXF Web Service 简单示例


1 准备工作

2 第一个例子

3 客户端

3.1 使用 WSDL 生成客户端

4 RPC 风格

5 相关命令介绍

5.1 Java to WS


1 准备工作

2 第一个例子

步骤如下

  1. 创建 Maven 项目, 使用 quickstart 模板

  2. 在 pom.xml 中引入依赖包,如下所示

    pom.xml

    <properties>
    <cxf.version>3.1.0</cxf.version>
    </properties>
    <dependencies>
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>${cxf.version}</version>
    </dependency>
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>${cxf.version}</version>
    </dependency>
    <dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http-jetty</artifactId>
    <version>${cxf.version}</version>
    </dependency>
    <dependency>
    <groupId>javax.xml</groupId>
    <artifactId>webservices-api</artifactId>
    <version>2.0.1</version>
    </dependency>
    </project>
  3. 写一个简单的 Service 类,如下所示

    HelloService.java

    package lld.cxf.service;
    import javax.jws.WebService;
    @WebService
    public interface HelloService {
    String sayHi(String name);
    }

    HelloServiceImpl.java

    package lld.cxf.service;
    public class HelloServiceImpl implements HelloService {
    public String sayHi(String name) {
    return "Hello " + name;
    }
    }
  4. 创建 Server 如下所示, 这就是为什么需引入 cxf-rt-transports-http-jetty 包的原因,CXF 内嵌了 Jetty server。

    HelloServer.java

    package lld.cxf.service;
    import org.apache.cxf.frontend.ServerFactoryBean;
    public class HelloServer {
    public static void main(String[] args) {
    // Create our service implementation
    HelloService helloWorldImpl = new HelloServiceImpl();
    // Create our Server
    ServerFactoryBean svrFactory = new ServerFactoryBean();
    svrFactory.setServiceClass(HelloService.class);
    svrFactory.setAddress("http://localhost:9000/Hello");
    svrFactory.setServiceBean(helloWorldImpl);
    svrFactory.create();
    }
    }
  5. 运行 Server 后可在浏览器中输入 http://localhost:9000/Hello?wsdl 验证

  6. 创建 Client 端如下所示

3 客户端

3.1 使用 WSDL 生成客户端

上例中我们直接把客户端和服务端放在了一个项目中,实际情况一般不会这样。通常是服务端发布 WSDL 的 URL,客户端使用 WSDL 来生成本地 Proxy 代码并访问 Web Service。

  1. 首先我们得生成 WSDL 文件,最省事的办法是直接在浏览器中访问上例中的 WSDL 链接并把浏览器中的文本结果另存为本地文件并以 wsdl 作为扩展名

    或者我们也可以根据编译结果生成 wsdl 文件。在下载的 CXF 中,在 bin 目录下找到 java2ws 命令,进入结果文件根目录(classes 目录),运行命令如下所示:

    java2ws -wsdl -o HelloService.wsdl lld.cxf.service.HelloService

    将会在当前目录生成 HelloService.wsdl

  2. 根据 wsdl 文件生成客户端 stub,同样是使用 CXF 下载包中的 wsdl2java 命令,如下所示

    wsdl2java -client -d ClientDir ../resources/HelloService.wsdl

    将把 Stub 生成在当前目录的 ClientDir 目录下

  3. 上一步生成的 Stub 中里面包含了很多文件,细节先不用管,把这些文件复制到当前源代码目录中,其中有一个文件 HelloServicePortType_HelloServicePort_Client.java 是一个客户端的调用示例文件,可参考里面的内容写出如下的客户端调用

    我将生成的 HelloService.wsdl 文件放在了 resources 目录下,也就是会自动复制到 classes 根目录下。

    HelloService.java

    package lld.cxf.client.test;
    
    import java.net.MalformedURLException;
    import java.net.URL;
    import javax.xml.namespace.QName;
    import lld.cxf.service.HelloService;
    import lld.cxf.service.HelloServicePortType; public class HelloClientTest {
    private static final QName SERVICE_NAME = new QName("http://service.cxf.lld/", "HelloService"); public static void main(String[] args) throws MalformedURLException {
    String wsdlFileName = "HelloService.wsdl";
    URL wsdlURL = HelloClientTest.class.getClassLoader().getResource(wsdlFileName); HelloService ss = new HelloService(wsdlURL, SERVICE_NAME);
    HelloServicePortType port = ss.getHelloServicePort();
    System.out.println("Invoking sayHi...");
    String result = port.sayHi("Lindong");
    System.out.println("sayHi.result=" + result);
    }
    }
  4. 另外也可以不必将 wsdl 存放在本地而是直接从远端获取,将上面获取 URL 的代码进行如下替换即可:

    String wsdlUrl = "http://localhost:9000/Hello?wsdl";
    URL wsdlURL = new URL(wsdlUrl);

通常情况下,如果公司不是按代码量算薪水,我们一般会将 Stub 类打成 jar 包放在引用路径里,以使代码更加清晰。如果使用 Eclipse,可直接使用 Export 功能将选中的 Stub package 导出为jar 包。

4 RPC 风格

将上面的 Service 类修改如下,将生成 RPC 风格的 Web Service

HelloService.java

package lld.cxf.service;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
@WebService
@SOAPBinding(style = Style.RPC)
public class HelloService {
public String sayHi(String name) {
return "Hello " + name;
}
}

5 相关命令介绍

5.1 Java to WS

5.1.1 Overview

官方帮助:Java to WS

在 2.1 以前的版本中命令为 java2wsdl,在新的版本中为 java2ws

java2ws 用于生成 Web service endpoint's implementation (SEI) 类并根据这些类生成 WSDL 文件, Bean 封装类, 用于启动服务的服务端代码和客户端方问代码。

5.1.2 语法

语法如下所示:

java2ws -databinding  -frontend
-wsdl -wrapperbean -client -server -ant -o
-d -classdir
-cp -soap12 -t
-beans *
-address -servicename
-portname -createxsdimports -h -v -verbose
-quiet {classname}

5.1.3 参数说明

各参数说明如下:

Option

Interpretation

-?,-h,-help

Displays the online help for this utility and exits.

-o

Specifies the name of the generated WSDL file.

--databinding

Specify the data binding (aegis or jaxb). Default is jaxb for jaxws frontend, and aegis for simple frontend.

-frontend

Specify the frontend to use. jaxws and the simple frontend are supported.

-wsdl

Specify to generate the WSDL file.

-wrapperbean

Specify to generate the wrapper and fault bean

-client

Specify to generate client side code

-server

Specify to generate server side code

-ant

Specify to generate an Ant build.xml script

-cp

Specify the SEI and types class search path of directories and zip/jar files.

-soap12

Specifies that the generated WSDL is to include a SOAP 1.2 binding.

-t

Specifies the target namespace to use in the generated WSDL file.

-servicename

Specifies the value of the generated service element's name attribute.

-v

Displays the version number for the tool.

-verbose

Displays comments during the code generation process.

-quiet

Suppresses comments during the code generation process.

-s

The directory in which the generated source files(wrapper bean ,fault bean ,client side or server side code) are placed.

-classdir

The directory in which the generated sources are compiled into. If not specified, the files are not compiled.

-portname

Specify the port name to use in the generated wsdl.

-address

Specify the port address.

-beans

Specify the pathname of a file defining additional Spring beans to customize databinding configuration.

-createxsdimports

Output schemas to separate files and use imports to load them instead of inlining them into the wsdl.

-d

The directory in which the resource files are placed, wsdl file will be placed into this directory by default

classname

Specifies the name of the SEI class.

5.1.4 示例

java2ws -wsdl -d ./resources lld.cxf.service.HelloService
java2wsdl -cp ./tmp org.apache.hello_world_soap_http.Greeter
java2wsdl -o hello.wsdl org.apache.hello_world_soap_http.Greeter
java2wsdl -o hello.wsdl -t http://cxf.apache.org org.apache.hello_world_soap_http.Greeter

5.1.5 与 Ant 集成

<?xml version="1.0"?>
<project name="cxf java2ws" basedir=".">
<property name="cxf.home" location ="/usr/myapps/cxf-trunk"/>
<property name="build.classes.dir" location ="${basedir}/build/classes"/>
<path id="cxf.classpath">
<pathelement location="${build.classes.dir}"/>
<fileset dir="${cxf.home}/lib">
<include name="*.jar"/>
</fileset>
</path> <target name="cxfJavaToWS">
<java classname="org.apache.cxf.tools.java2ws.JavaToWS" fork="true">
<arg value="-wsdl"/>
<arg value="-o"/>
<arg value="hello.wsdl"/>
<arg value="service.Greeter"/>
<classpath>
<path refid="cxf.classpath"/>
</classpath>
</java>
</target>
</project>

CXF 教程(一)的更多相关文章

  1. CXF 教程 (二)

    将 Service 布署在远端 1 Overview 2 Server 3 Client 1 Overview 上例中我们的 Server 和 Client 都是在本地.下面演示如果布署在远端需如何修 ...

  2. Java WebService 教程系列之 Spring 整合 CXF

    Java WebService 教程系列之 Spring 整合 CXF 一.引入 jar 包 <dependency> <groupId>org.apache.cxf</ ...

  3. Apache CXF实现WebService入门教程(附完整源码)

    Apache CXF实现WebService非常简单实用,只需要几步就可以实现一个简单的web service. 首先我们需要新建一个maven项目,在pom中添加依赖和jetty作为测试的web s ...

  4. CXF WebService 教程

    业务需求:常见WEB服务: 手机淘宝.京东…. 天气预报 手机号归属地 股票查询 发手机短消息 手机充值功能 中英文翻译 银行转账业务 公司的“进销存系统”在某商品缺货时自动给供应商下订单 ..... ...

  5. Springmvc集成CXF请看教程二

    转自: http://www.cnblogs.com/xiaochangwei/p/5399507.html 继上一篇webService入门之后,http://www.cnblogs.com/xia ...

  6. 史上最详cxf-Springmvc-maven实现webservice教程(转)

    虽知道webservice,工作两年一直没使用过,最近不忙趁机研究了下,实现了简单的服务端及客户端调用.鉴于慕课网没有webservice的教程,大多又都是学生,就在这里跟大家分享下,内容比较详细.大 ...

  7. CXF实现webservice

    虽然网上有很多cxf的教程,但还是要自己写写, “好记性不如烂笔头” 1.服务端 1.1  DEMO,用于测试传递对象 package com.xq.model; import javax.persi ...

  8. [转贴]JAVA :CXF 简介

    Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF.CXF 继 ...

  9. CXF框架入门实例

    首先:什么是CXF?为什么要用CXF? CXF 包含了大量的功能特性,但是主要集中在以下几个方面:支持 Web Services 标准:CXF 支持多种 Web Services 标准,包含 SOAP ...

随机推荐

  1. 创建readonly只读用户脚本

    身为一名运维工作人员,保证服务器的安全是必要项,当开发人员或测试人员需登录到服务器查看日志等操作时,可只给定特定的权限防止误操作的惨况产生. 以下脚本内容均为我本人环境,如有更改可自行修改. ~]# ...

  2. Centos 7 解决free -m 下buff/cache缓存很高

    Linux服务器运行一段时间后,由于其内存管理机制,会将暂时不用的内存转为buff/cache,这样在程序使用到这一部分数据时,能够很快的取出,从而提高系统的运行效率,所以这也正是linux内存管理中 ...

  3. echarts - 折线图 - 每秒刷新数据并显示

    function randomData() { now = new Date(+now + oneDay); value = value + Math.random() * 21 - 10; var ...

  4. Spring Boot 注入外部配置到应用内部

    Spring Boot允许你外部化你的配置,这样你就可以在不同的环境中使用相同的应用程序代码,你可以使用properties文件.YAML文件.环境变量和命令行参数来外部化配置,属性值可以通过使用@V ...

  5. Logstash 学习资料

    学习资料 网址 Logstash Reference(官方) https://www.elastic.co/guide/en/logstash/current/introduction.html

  6. yandexbot ip列表整理做俄罗斯市场的站长可以关注一下

    这段时间ytkah在负责一个客户的网站,主要做俄罗斯市场,当然是要研究Yandex了,首先是要知道yandexbot的ip有哪些,本文通过分析这个站从2018.12.02到2019.05.21这段时间 ...

  7. IComparable和IComparer接口

    C#中,自定义类型,支持比较和排序,需要实现IComparable接口.IComparable接口存在一个名为CompareTo()的方法,接收类型为object的参数表示被比较对象,返回整型值:1表 ...

  8. 利用$a_n$与$S_n$的关系求通项$a_n$

    前言 由\(a_n\)与\(S_n\)的关系求数列\(\{a_n\}\)的通项公式,在求通项公式题型中占有比较大的份额,是一个重要的求解思路和方法.是要求重点掌握的类型. 一.方法依据 二者关系:\( ...

  9. 接口自动化框架2-升级版(Pytest+request+Allure)

    前言: 接口自动化是指模拟程序接口层面的自动化,由于接口不易变更,维护成本更小,所以深受各大公司的喜爱. 第一版入口:接口自动化框架(Pytest+request+Allure) 本次版本做了一些升级 ...

  10. 2018-2019-2 网络对抗技术 20165230 Exp9 :Web安全基础

    目录 实验目的 实验内容 Webgoat前期准备 出现的问题 (一)SQL注入攻击 命令注入:Command Injection 数字型注入:Numeric SQL Injection 日志欺骗:Lo ...