JSP学习笔记(一百二十八):使用axis1.4开发webservice应用(三)
以前已经写过两篇关于axis1.4的文章,这里要再做些补充,是在实际应用中遇到的问题
问题一、webservice中传输实体类的方法
发布服务时,需要修改deploy.wsdd文件
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="MyService" provider="java:RPC"> <parameter name="className" value="com.site.webservice.MyService" /> <parameter name="allowedMethods" value="*" /> <beanMapping languageSpecificType="java:com.site.pojo.Pojo1" qname="ns1:Pojo1" xmlns:ns1="urn:BeanService" /> <beanMapping languageSpecificType="java:com.site.pojo.Pojo2" qname="ns2:Pojo2" xmlns:ns2="urn:BeanService" /> </service> </deployment>
注意文件中新添加的内容beanMapping那段,不管是服务传递参数,还是服务返回的对象,都写到beanMapping里就行。然后调用deploy.bat发布服务。
客户端调用的命令也需要重新执行,执行以后,会把相应的实体类对象带过去
问题二、服务端调用跟Spring做整合的问题
用axis发布的服务的时候,一般都会调用数据库,如果用到了spring,就要牵扯到跟Spring做整合的问题了,我一般是这么做,直接把Spring实例化的对象找出来,引用
public class MyService extends ServletEndpointSupport { private Service1 service1; @Override protected void onInit() throws ServiceException { service1= (Service1 )getApplicationContext().getBean("service1Impl"); super.onInit(); } public String queryValue(String s) { return service1.queryValue(s); } }
注意看代码,MyService服务类继承了ServletEndpointSupport类,然后重写了OnInit方法,在这个方法里面,引用Spring实例化过的对象,这个service1对象里面就是操作数据库的各种方法。
问题三、客户端调用跟Spring整合的问题
客户端在通过命令执行后,会生成一组文件,其中有一个文件是XXXLocator,我这里用到了Spring的注解,直接在XXXLocator类上加上@Repository
@Repository public class MyServiceLocator extends org.apache.axis.client.Service implements com.website.client.MyServiceService { ...... }
然后在需要调用的地方引用即可
@Repository public class MyDAOImpl implements MyDAO { @Autowired private MyServiceLocator myServiceLocator; public String queryValueString s) { String returnValue = ""; try { returnValue = myServiceLocator.getMyService().queryValue(s); } catch (Exception e) { e.printStackTrace(); } return returnValue; } }