• Spring项目跟Axis2结合


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

    1.开放WebService服务

       1.引入必要的jar包

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

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

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

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

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

            image

            service.xml中的内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <service name="testWebService">
        <description>testWebService</description>
        <parameter name="ServiceObjectSupplier">
            org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier
        </parameter>
        <parameter name="SpringBeanName">TestWebService</parameter>
        <messageReceivers>
            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"
                class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
            <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
        </messageReceivers>
        <schema schemaNamespace="http://service.telchina.cn" />
    </service>

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

    <servlet>
            <servlet-name>AxisServlet</servlet-name>
            <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
            <load-on-startup>2</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>AxisServlet</servlet-name>
            <url-pattern>/services/*</url-pattern>
        </servlet-mapping>

       4.修改ApplicationContext.xml

    <bean id="applicationContext" class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder" 
            />

    PS:

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

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

    官方描述:https://axis.apache.org/axis2/java/core/docs/spring.html

       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是有本质的区别。

    在浏览器中输入地址:http://localhost:8080/axis2Project/services/testWebService?wsdl

    可以看到:

    image

    参考文章:

      1.http://www.cnblogs.com/linjiqin/archive/2011/07/05/2098316.html

      2.http://sunpfsj.blog.163.com/blog/static/1770500972013424113314769/

  • 相关阅读:
    算法初步——哈希表B.1038统计同成绩学生
    算法初步——哈希表B10133.旧键盘打字 (注意bool型数组的赋值为true的方法)
    算法初步——哈希表B1029/A1084. 旧键盘
    算法初步——排序 A1012.The Best Rank(25)
    《思维导图》——东尼博赞
    算法初步——排序B1015/A1062.德才论
    入门模拟——(字符串处理)A1001. A+B Format(20)
    RMQ问题(线段树+ST算法)
    PKU 2406 Power Strings(KMP最长循环不重叠字串)
    KMP算法 kuangbin
  • 原文地址:https://www.cnblogs.com/sdjnzqr/p/3956424.html
Copyright © 2020-2023  润新知