AXIS2 开发WebService
1.服务端的开发
a. axis2不支持事务。对数据库增删改查一般都需要事务处理的,但是在对外发布的接口中是不能配置事务的。
解决方法:或者写一个代理类或者直接在dao中进行事务管理。
b. axis2不支持方法重载。
在对外发布的接口中不能使用方法重载,
[WARN] We don't support method overloading. Ignoring [updateClassifyTask]
[WARN] We don't support method overloading. Ignoring [updateClassifyTask]
[WARN] We don't support method overloading. Ignoring [updateClassifyTask]
如果你写了多个重名的方法,在该service中只会注册一个。
解决方法:无。要么更改成不同的方法名要么在传参上想办法
c. AXIS2 1.4.1 does not support java.util.Date type
Time portion of java.util.Date is missing from SOAP response in Axis2 1.5
瞧瞧axis2 的这些个bug,使用起来太不方便了。
虽然Apache的官方网站的bug页上有解决方案,但是我把DateServuce。aar文件考下来后仍然报相同的错误:
[ERROR] date string can not be less than 19 charactors
Caused by: java.lang.NumberFormatException: date string can not be less than 19 charactors
也不知道是怎么个意思,是把日期转换一下吗?好郁闷- - !
Axis2 1.5只能返回日期部分,时间部分丢失了!
解决方法:把Date类型都改成String类型的,这样是最安全的,但可能跟要求不符,应该不能算是一个好的解决方案吧。
d. axis2不能传递list类型的数据集合。
解决方法:将list转换成数组类型。这个还不算麻烦吧。
e. 配置axis2 servlet的是时候要配置成/services/*的形式,因为生成本地代码的时候本地代码已经含有地址,不能手动填入地址,发现如果配置成/erbServices/*这样子不可以
2.与Spring 整合
a. web.xml中配置axis2 servlet
<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-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping>
b. 建立发布webService的配置文件
在webroot下面建立services文件夹名字必须为services,services文件夹下面在建立一个文件夹,名字可随便起,如:mytest,testService等等,如果起名为mytest ,在mytest文件夹下面在建立META-INF文件夹,
在META-INF文件夹下创建ServiceData.xml(里边是空文件,如果不建立,会报找不到此文件异常,暂时没发现有什么其他作用)和services.xml(里边定义webservice向外暴露的接口)
ServiceData.xml
<?xml version="1.0" encoding="UTF-8"?> <ServiceData> </ServiceData>
services.xml
<?xml version="1.0" encoding="UTF-8"?> <serviceGroup> <service name="EmpService"> <description>axis2与spring集成案例</description> <!-- 通过ServiceObjectSupplier参数指定SpringServletContextObjectSupplier类 来获得Spring的ApplicationContext对象 --> <parameter name="ServiceObjectSupplier"> org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier </parameter> <!-- SpringBeanName固定的不能改 helloWorld是spring中注册的实现类得id --> <parameter name="SpringBeanName">empWebService</parameter> <!-- 在这里最值得注意的是<messageReceivers>元素,该元素用于设置处理WebService方法的处理器。 例如,getGreeting方法有一个返回值,因此,需要使用可处理输入输出的RPCMessageReceiver类, 而update方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。 --> <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> </service> </serviceGroup>
c.集成spring配置
在application-context.xml中配置以下bean
<bean id="applicationContext" class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder" />
发布成功后测试地址eg: http://localhost:8084/pro_service/services/EmpService?wsdl