利用axis2将SSH项目发布成Web Service
1.开发环境
eclipse,axis2war,SSH项目
axis2的eclipse插件:
axis2-eclipse-codegen-wizard.zip用于生成stub本地代码
axis2-eclipse-service-archiver-wizard.zip用于发布webservice
2.安装过程
1.下载完2个插件的压缩文件后,可以直接把解压后的文件拷贝到eclipse的plugins目录中
从axis2bin包里找到:backport-util-concurrent-3.1.jar和geronimo-stax-api_1.0_spec-1.0.1.jar
复制到eclipse\plugins\Axis2_Codegen_Wizard_1.3.0\lib文件夹下。
backport-util-concurrent-3.1.jar需要在网上downloadsite:http://www.findjar.com/jar/mule/dependencies/maven2/backport-util-concurrent/backport-util-concurrent/3.1/backport-util-concurrent-3.1.jar.html
2.修改eclipse\plugins\Axis2_Codegen_Wizard_1.3.0\plugin.xml文件
在<runtime>內加入下面的字串
<libraryname="lib/geronimo-stax-api_1.0_spec-1.0.1.jar">
<exportname="*"/>
</library>
<libraryname="lib/backport-util-concurrent-3.1.jar">
<exportname="*"/>
</library>
3.把Axis2_Codegen_wizard_1.3.0(eclipse/plugins/Axis2_Codegen_wizard_1.3.0)的名字改成Axis2_Codegen_wizard_1.4.0
在plugin.xml中在<plugin>中把Axis2_Codegen_wizard的version="1.3.0"改成version="1.4.0"
到plugin.xml文件中,保存后重新启动Eclipse即可
3.开发过程
1.在spring的配置文件里加入:
<beanid="applicationContext"class="org.apache.axis2.extensions.spring.receivers.ApplicationContextHolder"/>
2.在axis2容器里的web.xml加入如下代码,用于加载spring的配置文件,用于初始化bean
<listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name> contextConfigLocation </param-name> <param-value> /WEB-INF/applicationContext.xml </param-value> </context-param>
3.目录结构:tomcat/axis2/WEB-INF
项目的配置文件都放在这里
修改配置文件里的一些内容:主要是加载路径相关,eg:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"> <value>/WEB-INF/hibernate.cfg.xml</value> </property> </bean>
4.发布服务
aar包里在META-INF里面是
这个aar包里不需要放置类文件,只要一个services.xml用于标识将哪个类发布为服务
文件内容
<servicename="student">
<description>
PleaseTypeyourservicedescriptionhere
</description>
<messageReceivers>
<messageReceivermep="http://www.w3.org/2004/08/wsdl/in-only"class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceivermep="http://www.w3.org/2004/08/wsdl/in-out"class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parametername="ServiceObjectSupplier">
org.apache.axis2.extensions.spring.receivers.SpringAppContextAwareObjectSupplier
</parameter>//猜测是springaxis2结合所需要的类
<parametername="SpringBeanName">studentservice</parameter>
//发布的服对应的类,因为是利用spring来加载,所以这里必须是spring配置文件里对应的beanid
//而不能是类的绝对路径,因为需要spring的注入功能所以要从spring窗口里去取得类的实例
</service>
5.向axis2容器里添加项目的Lib包:
注:
axis2可能不支持List<T>这种集合类型,所以要使用对象数组类型来返回多个数据,或者利用String返回,将其在client端进行解析。
So the implementaion will be; public String[] getRes(int a, int b) throws Exception { List list = new ArrayList(); list.add("ddd"); list.add("ddd"); list.add("ddd"); System.out.println(list); return (String[]) list.toArray(new String[list.size()]); } If the method signature returns collections, there is no way for Axis2 to figure out types of the items included in the list, hence you will get an error.
这两天忽然对axis2来了兴趣,于是下载来摆弄.
我没有直接在下载的axis2的war包的基础上去做,而是一步一步把axis2添加到我原有的工程里面去,这样做确实挺累人的,不过网上已经很多这样的文章,因此我不去写它了
我感兴趣的是,怎么让axis能传输java对象,其实也有文章介绍,见
因为我原来的应用是struts2+spring+hibernate的,便很自然的想把axis2的service整合到spring去,结果却发现一个axis2的bug,在axis2的论坛已经有人提过,好像还没有修复.
如果你做一个Bean,并让Spring为这个bean生成事务代理的JDK动态代理类,那么,启动应用的时候,就报类似
org.apache.axis2.deployment.DeploymentException:Thefollowingerroroccurredduringschemageneration:Unabletoloadbytecodeforclass$Proxy4
这样的出错信息,很郁闷.
这意味着什么?以为着我们公布的webservice不能直接参与事务,而是需要把事务"代理"给其他的类处理!!!
又多了一层不必要的封装!!!
我理想中的模型
Client--------->ProxyTransactionalWebServiceBean
现在
Client---------->ProxyImpl---------->ProxyTransactionalWebServiceBean