• CXF 教程(一)


    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>

     

  • 相关阅读:
    java web中使用log4j
    Apache Log4j配置说明
    sql数据库为null时候ASP语句判断问题
    js实现两个文本框数值的加减乘除运算
    js实现文本框支持加减运算的方法
    php报错syntax error, unexpected T_GOTO, expecting T_STRING,报错文件与行数指向以下代码,是什么原因?
    安装DEDECMS出现Function ereg_replace()错误的解决方法
    按钮显示隐藏div、input等
    设计input搜索框提示文字点击消失的效果
    Xcode export/upload error: Your session has expired. Please log in-b
  • 原文地址:https://www.cnblogs.com/lldwolf/p/7719521.html
Copyright © 2020-2023  润新知