博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring项目跟Axis2结合
阅读量:5094 次
发布时间:2019-06-13

本文共 4627 字,大约阅读时间需要 15 分钟。

本文的前提是已经有一个Spring的项目,在此基础上如何跟Axis2进行结合,开发出WebService服务和调用WebService服务。

1.开放WebService服务

   1.引入必要的jar包

         将axis2-1.6.2-bin\axis2-1.6.2\lib所有包引入到你自己的工程中。(当然里面有些是不必要的,有兴趣的可以自己删减)。

   2.引入必要的文件,以及创建新的Service.xml

        1.将\axis2-1.6.2-war\axis2\WEB-INF中的conf目录,modules目录,copy到你工程的WEB-INF中。

        2.在WEB-INF中,新建services目录(必须),里面可以划分具体的子目录,子目录底下创建META-INF目录(必须),,目录下新建文件:services.xml(必须),

         创建完成后,目录结构如下:

       

        service.xml中的内容如下:

testWebService
org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier
TestWebService

   3.修改Web.xml,增加以下配置

AxisServlet
org.apache.axis2.transport.http.AxisServlet
2
AxisServlet
/services/*

   4.修改ApplicationContext.xml

PS:

  必须要加此配置,否者报错:

Caused by: java.lang.Exception: Axis2 Can't find Spring's ApplicationContext

官方描述:

   5.创建服务类

package cn.telchina.standard.service;import org.springframework.stereotype.Component;@Component("TestWebService")public class TestWebService {    public String sayHello(String name) {          return "hello"+name;      } }

 

2.调用WebService服务

调用有两种方式:

1.RPC方式

public  void testRPCClient() {          try {          // axis2 服务端            String url = "http://localhost:8080/axis2Project/services/testWebService";                  // 使用RPC方式调用WebService            RPCServiceClient serviceClient = new RPCServiceClient();            // 指定调用WebService的URL            EndpointReference targetEPR = new EndpointReference(url);            Options options = serviceClient.getOptions();            //确定目标服务地址            options.setTo(targetEPR);                  /**            * 指定要调用的getPrice方法及WSDL文件的命名空间            * 如果 webservice 服务端由axis2编写            * 命名空间 不一致导致的问题            * org.apache.axis2.AxisFault: java.lang.RuntimeException: Unexpected subelement arg0            */            QName qname = new QName("http://service.telchina.cn", "sayHello");            // 指定getPrice方法的参数值            Object[] parameters = new Object[] { "name" };                        // 指定getPrice方法返回值的数据类型的Class对象            Class[] returnTypes = new Class[] { String.class };                  // 调用方法一 传递参数,调用服务,获取服务返回结果集            OMElement element = serviceClient.invokeBlocking(qname, parameters);            //值得注意的是,返回结果就是一段由OMElement对象封装的xml字符串。            //我们可以对之灵活应用,下面我取第一个元素值,并打印之。因为调用的方法返回一个结果            String result = element.getFirstElement().getText();           System.out.println(result);        //          // 调用方法二 getPrice方法并输出该方法的返回值  //          Object[] response = serviceClient.invokeBlocking(qname, parameters, returnTypes);  //          // String r = (String) response[0];  //          String r = (String) response[0];  //          System.out.println(r);                } catch (AxisFault e) {            e.printStackTrace();          }        }

2.AXIOM方式

/**        * 方法二: 应用document方式调用        * 用ducument方式应用现对繁琐而灵活。现在用的比较多。因为真正摆脱了我们不想要的耦合        */        public  void testDocument() {          try {            // String url = "http://localhost:8080/axis2ServerDemo/services/StockQuoteService";            String url = "http://localhost:8080/axis2Project/services/testWebService";                  Options options = new Options();            // 指定调用WebService的URL            EndpointReference targetEPR = new EndpointReference(url);            options.setTo(targetEPR);            // options.setAction("urn:getPrice");                  ServiceClient sender = new ServiceClient();            sender.setOptions(options);                                    OMFactory fac = OMAbstractFactory.getOMFactory();            // 命名空间,有时命名空间不增加没事,不过最好加上,因为有时有事,你懂的            OMNamespace omNs = fac.createOMNamespace("http://service.telchina.cn", "");                  OMElement method = fac.createOMElement("sayHello", omNs);            OMElement symbol = fac.createOMElement("name", omNs);            // symbol.setText("1");            symbol.addChild(fac.createOMText(symbol, "Axis2 Echo String "));            method.addChild(symbol);            method.build();                        OMElement result = sender.sendReceive(method);                  System.out.println(result);                } catch (AxisFault axisFault) {            axisFault.printStackTrace();          }        }

 

PS:

虽然这个例子中使用SPring的注解方式来声明了bean,但是Axis2本身不支持使用@WebService的注解直接声明服务,这个跟CXF是有本质的区别。

在浏览器中输入地址:

可以看到:

 

参考文章:

  1.

  2.

转载于:https://www.cnblogs.com/sdjnzqr/p/3956424.html

你可能感兴趣的文章
领域特定语言DSL
查看>>
Bochs 2.4.5 调试版本的安装
查看>>
Nginx下安装PIP监控软件
查看>>
Linux再追加
查看>>
在ADVANCED INSTALLER 中集成安装.NET环境需要注意问题 .
查看>>
datatables 参数详解(转)
查看>>
java IO流的体系结构图
查看>>
UVA_11877.第三次比赛C题:The Coco Cola
查看>>
自制图片过渡效果(共享)
查看>>
Struts2框架使用(八)之struts2的国际化
查看>>
2018-2019-2 20165219《网络对抗技术》Exp8 Web基础
查看>>
putaocheng
查看>>
PHP防SQL注入攻击
查看>>
php安全 过滤、验证、转义
查看>>
《计算机网络 自顶向下》读书笔记 第二章——应用层(1)
查看>>
ceoi 2011 Matching kmp
查看>>
EOJ Monthly 2019.2 A. 回收卫星
查看>>
VS2010下安装boost库
查看>>
Dynamics CRM 修改Excel 最大导出记录限制及 最大上传文件限制
查看>>
(转)2014年最新前端开发面试题(题目列表+答案 完整版)
查看>>