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/

原文地址:https://www.cnblogs.com/sdjnzqr/p/3956424.html