内容


使用 Axis2 和 JiBX 将 Java 类转换成 Web 服务,第 2 部分

把 XML 转换成功能全面的 Web 服务

利用 Axis2 和 JiBX 生成、部署和测试 Web 服务

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: 使用 Axis2 和 JiBX 将 Java 类转换成 Web 服务,第 2 部分

敬请期待该系列的后续内容。

此内容是该系列的一部分:使用 Axis2 和 JiBX 将 Java 类转换成 Web 服务,第 2 部分

敬请期待该系列的后续内容。

简介

Apache Axis2 提供了好几种 XML 解决方案,可以轻松的开发功能强大的 Web 服务。Axis2 是实现 Web 服务的一个非常不错的选择。由于 Apache Axis2 和 Apache Geronimo duo 是免费而且开放源码的,因此可以考虑使用这两者。

在本系列的前一部分中,我向您介绍了在本系列两篇文章中使用到的 Java 类(参见 参考资料)。我们通过 WSDL 将这些类作为 Web 服务公开,然后创建了一个 JiBX 定义描述,该定义描述将在文本中与 JiBX 数据绑定通信,来测试 Web 服务。在测试过程中,我们通过编译 JiBX 绑定类来创建包装类,使数据绑定类成为整个 Web 服务中的一个功能部分。

在继续深入开发之前,先要确保 <axis2_home>/lib 中的所有的 JAR 文件(包括您在本系列文章第一部分中拷贝的 JiBX 文件)都在您的类路径下,并且在本文整个过程中要一直存在。同时,还需确保您的系统中已安装 Ant。Ant 可以从 Apache 下载获得(参见 参考资料)。

让我们开始生成服务吧。

生成服务

首先,需要使用 Axis2 生成服务,这样您就可以使用稍后创建的客户机来对它进行测试。在上篇文章开始之前,您应该已下载好必要的工具,并且设置好 AXIS2_HOME 环境变量。要开始创建服务,键入清单 1 中的命令。

清单 1. 创建服务
java org.apache.axis2.wsdl.WSDL2Java
-uri C:\apps\webapps\IBM-JiBX\SimpleService.wsdl
-p com.ibm.devWorks.xml.simpleService -d jibx -s -ss -sd -ssi 
-Ebindingfile ../binding.xml

这将为您创建最基本的服务!下列部分显示了各命令开关的注解:

  • -uri 开关告诉 Axis2 在哪能找到用于生成服务的 WSDL 文件。
  • -p 开关告诉 Axis2 服务要使用的 Java 包类。
  • -d jibx 选项指定 JiBX 数据绑定。
  • -s 开关指定只有同步(块)方法可用。
  • -ss 开关告诉 Axis2 要构建服务器端代码。
  • -sd 开关告诉 Axis2 要构建一个服务描述符(services.xml 文件)。
  • -ssi 开关是可选的,用于为服务实现 ( SimpleServiceSkeleton.java ) 创建一个 Java 接口。
  • -Ebinding 开关告诉 Axis2 在哪能找到 JiBX 定义说明文件。

现在已经有了一个 Web 服务,但是还没有任何定义。下一部分 将对服务进行定义。

定义服务主干

只要成功调用了 Web 服务的一项操作,便会调用服务主干中的方法。Web 服务操作的实现代码包含在一个叫做 SimpleServiceSkeleton.java 的文件中(在本例中)。该文件位于 src/com/ibm/devWorks/xml/simpleService 目录,并且是空文件。对它进行定义,如清单 2 所示。

清单 2. 定义服务主干
package com.ibm.devWorks.xml.simpleService;

public class SimpleServiceSkeleton implements SimpleServiceSkeletonInterface{

    public  void OneWay
        (
         com.ibm.devWorks.xml.simpleService.OneWayRequest OneWayRequest
         )
    {
        System.err.println("Request data: " + 
                           OneWayRequest.getRequestData());
    }

    public  com.ibm.devWorks.xml.simpleService.TwoWayResponse TwoWay
        (
         com.ibm.devWorks.xml.simpleService.TwoWayRequest TwoWayRequest
         )
    {
        System.err.println("Echo String : " +
                            TwoWayRequest.getEchoString());
        System.err.println("Booolean    : " +
                           TwoWayRequest.getBooolean());
                
        TwoWayResponse res = new TwoWayResponse();
                
        res.setEchoString(TwoWayRequest.getEchoString());
        res.setInvertedBoolean(!TwoWayRequest.getBooolean());

        return res;
    }
}

清单 2 中的代码含有两个方法,分别对应于本系列第一篇文章中讨论的两个操作(请参见 参考资料)。第一个方法,OneWay,是单向(或者只输入)操作,它使用 OneWayRequest Java 对象作为输入参数,并且没有返回值。其实现仅仅是在屏幕上显示从客户机发送过来的内容。

第二个方法, TwoWay,使用 TwoWayRequest Java 对象作为输入,并且返回 TwoWayResponse 响应。这个方法首先显示传入请求对象的 echoStringbooolean 字段,把响应中的 echoString 设置为请求中的 echoString 字段值,并把响应对象中的 invertedBoolean 值设置为请求对象中的 booolean 值的相反值(真则设为假,假则设为真)。然后把响应对象返回给客户机。

服务已经定义好了。接下来,我们将构建服务并创建 JiBX 数据绑定包装类。

完成 JiBX 数据绑定

在编译和创建 JiBX 数据绑定包装类之前,我们必须首先编译各类。要编译项目,键入:ant

此时切换到 build/classes 目录创建包装类,键入:java -jar <axis2_home>\lib\jibx-bind.jar ..\..\..\binding.xml

您会发现四个新的 JiBX_* 类文件。包装类已经创建完成。现在重新打包 Axis2 服务存档文件,键入(与之前相同的目录):ant

请注意,您不必构建代码两次。此处通过 Ant 可以知道代码已构建好,但是看到还有新文件,因此需要重新打包 Axis2 存档文件。

服务已经就绪,下节将在 Geronimo 上部署服务。

在 Geronimo 上部署

现在我们将部署刚刚创建和编译好的服务。如果 Geronimo 还未运行,应启动它,键入: java -jar <geronimo_home>/bin/server.jar

现在将服务存档文件 build/lib/SimpleService.aar 拷贝到 <geronimo_home>/repository/default/axis2/1166439304031/axis2-1166439304031.war/WEB-INF/services 目录(需注意,准确的目录将有所不同)。

服务将很快自动部署好,现在一切已就绪,下节将创建一个客户机对其进行测试。

生成客户机

客户机允许您测试 Web 服务的功能和部署的正确性。同样,我们将使用 JiBX 数据绑定创建一个客户机,用于测试已部署好的 Web 服务。

键入清单 3 中的命令,生成 Web 服务。

清单 3. 生成 Web 服务
java org.apache.axis2.wsdl.WSDL2Java
-uri C:\apps\webapps\IBM-JiBX\SimpleService.wsdl
-p com.ibm.devWorks.xml.simpleService
-d jibx -Ebindingfile ../binding.xml -s

上面的命令简单地创建了客户桩(client stub)代码。有关使用到的开关的解释,请参见 生成服务。接下来,我们将定义真正的客户机代码,其代码将用于测试 Web 服务。

编写测试代码

现在我们将编写用于测试 Web 服务已成功部署的代码,这会使用到我们刚刚使用 JiBX 数据绑定创建的客户桩。创建一个 src/com/ibm/devWorks/xml/simpleService/Client.java 文件,并对它进行定义,如清单 4 所示。

清单 4. 测试客户桩和部署的 Web 服务
package com.ibm.devWorks.xml.simpleService;

public class Client{
    public static void main(java.lang.String args[]){
        try{
            SimpleServiceStub stub =
                new SimpleServiceStub
                ("http://localhost:8080/axis2/services/SimpleService");

            oneWay(stub);
            twoWay(stub);
        } catch(Exception e){
            e.printStackTrace();
            System.out.println("\n\n\n");
        }
    }

    public static void oneWay(SimpleServiceStub stub){
        try{
            OneWayRequest req = new OneWayRequest();

            req.setRequestData("Here is your requested data!");

            stub.OneWay(req);
        } catch(Exception e){
            e.printStackTrace();
            System.out.println("\n\n\n");
        }
    }

    public static void twoWay(SimpleServiceStub stub){
        try{
            TwoWayRequest req = new TwoWayRequest();

            req.setEchoString("echo!... echo!");
            req.setBooolean(false);

            TwoWayResponse res = stub.TwoWay(req);

            System.out.println("Echo String : " +
                               res.getEchoString());
            System.out.println("Inv Boolean : " + 
                               res.getInvertedBoolean());
        } catch(Exception e){
            e.printStackTrace();
            System.out.println("\n\n\n");
        }
    }
}

粗体显示了值得注意的代码。这个客户机首先初始化客户桩对象,然后将其传递给两个可用方法。第一个方法,oneWay,创建一个 OneWayRequest 对象,并将 requestData 字段的值初始化为 Here is your requested data!,然后数据将传送到服务器,由于是单向操作,因此没有返回。

第二个方法,twoWay,创建一个 TwoWayRequest 对象并初始化 echoStringbooolean 字段。然后把请求对象发送给服务,并返回一个 TwoWayResponse 对象。根据 清单 1 中定义的逻辑,响应对象中的 echoString 值应该匹配请求对象中 echoString 的值,并且响应对象中的invertedBoolean 应该与请求对象中的 booolean 的字段值相反,或者为真(在本例中)。

我们已经完成了客户机定义。现在我们只需编译 JiBX 绑定包装类,与前面构建服务中的编译一样。

完成 JiBX 数据绑定

在为客户机编译和创建 JiBX 数据绑定包装类之前,我们首先需要编译各类。要编译项目,键入:ant

现在切换到 build/classes 目录创建包装类,键入:java -jar <axis2_home>\lib\jibx-bind.jar ..\..\..\binding.xml

我们应该注意到四个新创建的 JiBX_* 类文件,这与我们之前构建服务时一样。要重新打包包含客户机代码的 JAR 文件,键入(与之前相同的目录):ant

这就全部完成了!最后剩下要做的就是完成测试。

测试

现在,运行我们刚刚定义的客户机代码,我们应该在屏幕上看到正确的输出。在运行客户机之前,必须确保含有客户机代码(build/lib/SimpleService-test-client.jar)的 JAR 文件在您的类路径下。

要运行客户机,键入如下内容: java com.ibm.devWorks.xml.simpleService.Client

我们应该能看到服务的输出,如图 1 所示。

图 1. 显示服务输出的标准输出结果
显示服务输出的标准输出结果
显示服务输出的标准输出结果

请注意,正确的值已发送给服务。现在我们将检验发回客户机的值是否同样正确,这可以通过查看客户机的输出来完成,如图 2 所示。

图 2. 显示客户机输出
显示客户机输出
显示客户机输出

一切都工作良好,您现在就可以施展 Jibx 魔法了!

结束语

现在,您应该算是一员 JiBX-Axis2 Web 服务开发人员了,能够使用 Axis2 和 JiBX 将您喜欢的一些 Java 类转换成 Web 服务。

在本系列的两篇文章中,我们通过 WSDL 将 Java 类公开,并使用 JiBX 定义描述将它们映射到 XML 数据。在这篇文章中,我们创建了一个实时的 Web 服务,这个服务是使用 Axis2 和 Geronimo 部署的。然后使用 Axis2 创建和运行客户机,来测试最终的实现。对于客户机和服务,我们都指定了 JiBX 数据绑定并分别为它们成功地创建了数据绑定包装类。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Java technology, SOA and web services, Open source
ArticleID=219243
ArticleTitle=使用 Axis2 和 JiBX 将 Java 类转换成 Web 服务,第 2 部分: 把 XML 转换成功能全面的 Web 服务
publish-date=05102007