一、 新建一个web项目,
1.打开axis2.war包,将conf,lib,modules三个文件夹复制到项目的WEB-INF文件夹下,再在WEB-INF目录下新建一个services文件夹,然后在services文件下新建一个文件夹(任意取名);
再新建META-INF文件夹,最后再新增services.xml,接口信息就写在这里面。
具体路径:WEB-INF/services/myservice/META-INF/services.xml
2.配置 web.xml 。加载axis2 和 applicationContext.xml。
<!-- 加载配置文件 --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/*.xml</param-value> </context-param> <!-- 加载axis2 --> <servlet> <display-name>Apache-Axis Servlet</display-name> <servlet-name>axisServlet</servlet-name> <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>axisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
3.然后在项目中的src下创建包,再在包下创建一个类,用来提供web service接口。
package com.axis.service; public class TestAxis { public String test(String str) { return "test " + str; } public String printHello(String name) { return "hello " + name; } public String printWorld(String name) { return "World " + name; } }
4.配置 services.xml文件。
<?xml version="1.0" encoding="UTF-8"?> <service name="axisService" targetNamespace="http://e3.org/axis2Namespace/soapws"> <!-- 服务名描述 --> <description>axis2 接口开发范例</description> <!-- 命名空间可以自由定义 --> <schema schemaNamespace="http://e3.org/axis2Namespace/soapws" /> <!-- 方式一、直接写类位置 --> <!-- <parameter name="ServiceClass">com.axis.service.TestAxis</parameter> --> <!-- 方式二、指向的类位置,通过applicationContext.xml 配置 --> <parameter name="SpringBeanName">CrjWs</parameter> <parameter name="ServiceObjectSupplier"> org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier </parameter> <!-- 方式一 --> <operation name="test"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> <operation name="printHello"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> <operation name="printWorld"> <messageReceiver class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </operation> <!-- 方式二 --> <!-- <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" /> </messageReceivers> --> <!-- 屏蔽的接口 --> <excludeOperations> <operation>printHello</operation> </excludeOperations> </service>
5.配置文件 applicationContext.xml。
<!--WebService 入口的 bean --> <bean id ="CrjWs" class="com.axis.service.TestAxis" />
6. 目录结构。
7.运行该项目,使用浏览器访问地址
http://localhost:8080/webserviceTest/services/axisService?wsdl,
如果有异常信息,那就返回看一下是jar包缺失还是其它配置原因,自己从头细心再看看哪里是否没配置。
如果成功,会在页面上显示一份wsdl页面。
二、下面是我遇到的一些小问题。
1、报 The SERVICE_OBJECT_SUPPLIER parameter is not specified。
查看了一下发现是没有写监听器。在web.xml文件中添加
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
如果使用 SpringBeanName 的话,需要加载 ServiceObjectSupplier。
<parameter name="SpringBeanName">CrjWs</parameter> <parameter name="ServiceObjectSupplier"> org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier </parameter>
三、客户端调用。
package com.test; import javax.xml.namespace.QName; import org.apache.axis.client.Call; import org.apache.axis.client.Service; public class webTest { public static void main(String[] args) { String _newendPoint = "http://localhost:8080/webserviceTest/services/axisService?wsdl"; String _newNameSpace = "http://e3.org/axis2Namespace/soapws"; try { Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress(new java.net.URL(_newendPoint)); call.setOperationName(new QName(_newNameSpace, "test")); String s = (String) call.invoke(new Object[] {"test123"}); System.out.println(s); // call.setOperationName(new QName(_newNameSpace,"printHello")); // s = (String) call.invoke(new Object[] { "printHello456"}); // System.out.println(s); call.setOperationName(new QName(_newNameSpace, "printWorld")); s = (String) call.invoke(new Object[] { "printWorld789" }); System.out.println(s); } catch (Exception ex) { ex.printStackTrace(); } } }