使用axis2和spring发布webservice服务

    问题:有一个类,类里可能是这么写的:

    Public class A{

 public B doit(C c){

             ..........

         } 

    } 

    现在如果想把这个类发布成webservice服务供外部程序调用,需要解决一个问题 -- 外部程序如何知道类B和类C的结构?

    如果单纯使用axis2发布服务,传统做法可能是利用axis2插件或axis2提供的可执行文件根据类A生成N个文件,这些文件有一部分是代理了类B和类C的结构,并在代理类里加入了若干复杂且不知所云的方法,另外一部分代理了类A的结构,并使用了类B和类C的代理类作为参数,你需要将业务逻辑写在这个类A的代理类里面。将来服务发布成功以后,外部程序调用的其实是类A的代理类。这一团相互调用复杂的东东一旦出了问题跟踪起来让人一头雾水。

    现在使用了 spring,你只需要将类A做成spring里面的bean,类B和类C会自动被识别。类似这样:

    <bean id="AService" class="com.izumi.webservice.A"></bean> 

    对于环境的要求也很简单:

    1、包: axis2_XXXXX.jar(多个)  spring.jar(如果axis2版本过低,比如1.3,虽然内置了spring的包但版本过低,需要引进单独的spring.jar包,如果版本较高或许没这个必要,待验证)

    2、配置文件:

    web.xml中加入对spring的配置:

        <listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:*/spring/*.xml</param-value>
</context-param>
<servlet>
<servlet-name>AxisServlet</servlet-name>
<servlet-class>
org.apache.axis2.transport.http.AxisServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>AxisAdminServlet</servlet-name>
<servlet-class>
org.apache.axis2.transport.http.AxisAdminServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/servlet/AxisServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>*.jws</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>AxisAdminServlet</servlet-name>
<url-pattern>/axis2-admin/*</url-pattern>
</servlet-mapping> 

    spring配置文件:

    <bean id="privatePayBillService" class="com.izumi.webservice.server.privatepaybill.PrivatePayBill"></bean> 

    3、修改WEB-INF/services下的services.xml

<service name="PrivatePayBillService">
<description>
Weather Spring POJO Axis2 AAR deployment
                </description>
<parameter name="ServiceClass">com.izumi.A
</parameter>                   
<parameter name="ServiceObjectSupplier">org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier
</parameter>
<parameter name="SpringBeanName">AService
</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>

</service> 

说明:

1、service的name就是发布服务的名字 ,SpringBeanName 必须和spring配置文件中bean的id对应。

2、访问服务的wsdl使用这个url路径查看http://IP地址:端口号/应用名/services/服务名?wsdl 

 

 

posted on 2011-04-13 17:33  izumi  阅读(4195)  评论(0编辑  收藏  举报

导航