隨筆 - 312, 文章 - 14, 評論 - 1393, 引用 - 0
          數據加載中……

          WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService

          本文為原創,如需轉載,請注明作者和出處,謝謝!

          上一篇:WebService大講堂之Axis2(6):跨服務會話(Session)管理

             在現今的Web應用中經常使用Spring框架來裝載JavaBean。如果要想將某些在Spring中裝配的JavaBean發布成WebService,使用Axis2Spring感知功能是非常容易做到的。
              在本文的例子中,除了<Tomcat安裝目錄>\webapps\axis2目錄及該目錄中的相關庫外,還需要Spring框架中的spring.jar文件,將該文件復制到<Tomcat安裝目錄>\webapps\axis2\WEB-INF\lib目錄中。
              下面先建立一個JavaBean(該JavaBean最終要被發布成WebService),代碼如下:

          package service;
          import entity.Person;
          public class SpringService
          {
              
          private String name;
              
          private String job;
              
          public void setName(String name)
              {
                  
          this.name = name;
              }
              
          public void setJob(String job)
              {
                  
          this.job = job;
              }
              
          public Person getPerson()
              {
                  Person person 
          = new Person();
                  person.setName(name);
                  person.setJob(job);
                  
          return person;
              }
              
          public String getGreeting(String name)
              {
                  
          return "hello " + name;
              }
          }

              其中Person也是一個JavaBean,代碼如下:

          package entity;
          public class Person
          {
              
          private String name;
              
          private String job;
              
          public String getName()
              {
                  
          return name;
              }
              
          public void setName(String name)
              {
                  
          this.name = name;
              }
              
          public String getJob()
              {
                  
          return job;
              }
              
          public void setJob(String job)
              {
                  
          this.job = job;
              }
          }

              將上面兩個Java源文件編譯后,放到<Tomcat安裝目錄>\webapps\axis2\WEB-INF\classes目錄中。

              在<Tomcat安裝目錄>\webapps\axis2\WEB-INF\web.xml文件中加入下面的內容:

          <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>

              <Tomcat安裝目錄>\webapps\axis2\WEB-INF目錄中建立一個applicationContext.xml文件,該文件是Spring框架用于裝配JavaBean的配置文件,內容如下:

          <?xml version="1.0" encoding="UTF-8"?>
          <beans xmlns="http://www.springframework.org/schema/beans"
                  xmlns:xsi
          ="http://www.w3.org/2001/XMLSchema-instance"
                  xmlns:aop
          ="http://www.springframework.org/schema/aop"
                  xmlns:tx
          ="http://www.springframework.org/schema/tx"
                  xsi:schemaLocation
          ="
                      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
          >
            
          <bean id="springService" class="service.SpringService">
               
          <property name="name" value="姚明" />
               
          <property name="job" value="職業男籃" /> 
            
          </bean>   
          </beans>

              applicationContext.xml文件中裝配了service.SpringService類,并被始化了namejob屬性。在配置完SpringService類后,就可以直接在程序中FileSystemXmlApplicationContext類或其他類似功能的類讀取applicationContext.xml文件中的內容,并獲得SpringService類的對象實例。但現在我們并不這樣做,而是將SpringService類發布成WebService

              <Tomcat安裝目錄>\webapps\axis2\WEB-INF\lib目錄中有一個axis2-spring-1.4.1.jar文件,該文件用于將被裝配JavaBean的發布成WebService。在D盤建立一個axi2-spring-ws目錄,并在該目錄中建立一個META-INF子目錄。在META-INF目錄中建立一個services.xml文件,內容如下:

          <service name="springService">
              
          <description>
                  Spring aware
              
          </description>
              
          <parameter name="ServiceObjectSupplier">
                  org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier
              
          </parameter>
              
          <parameter name="SpringBeanName">
                  springService
              
          </parameter>
              
          <messageReceivers>
                  
          <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
                      class
          ="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
              
          </messageReceivers>
          </service>    

              Windows控制臺進入axi2-spring-ws目錄,并使用jar命令將axi2-spring-ws目錄中的內容打包成axi2-spring-ws.aar,然后將該文件復制到<Tomcat安裝目錄>\webapps\axis2\WEB-INF\services目錄中,啟動Tomcat后,就可以訪問該WebService了,訪問方式與前面幾篇文章的訪問方式相同。獲得wsdl內容的URL如下:

          http://localhost:8080/axis2/services/springService?wsdl

              在將Spring中的裝配JavaBean發布成WebService需要注意以下幾點:

              1. JavaBean編譯生成的.class文件需要放在WEB-INF\classes目錄中,或打成.jar包后放在WEB-INF\lib目錄中,而WEB-INF\services目錄中的.aar包中不需要包含.class文件,而只需要包含一個META-INF目錄,并在該目錄中包含一個services.xml文件即可。

              2. services.xml的配置方法與前幾篇文章的配置方法類似,只是并不需要使用ServiceClass參數指定要發布成WebServiceJava類,而是要指定在applicationContext.xml文件中的裝配JavaBean的名稱(SpringBeanName參數)。

              3. services.xml文件中需要通過ServiceObjectSupplier參數指定SpringServletContextObjectSupplier類來獲得SpringApplicationContext對象。

          下一篇:
          WebService大講堂之Axis2(8):異步調用WebService





          Android開發完全講義(第2版)(本書版權已輸出到臺灣)

          http://product.dangdang.com/product.aspx?product_id=22741502



          Android高薪之路:Android程序員面試寶典 http://book.360buy.com/10970314.html


          新浪微博:http://t.sina.com.cn/androidguy   昵稱:李寧_Lining

          posted on 2009-02-13 09:14 銀河使者 閱讀(17231) 評論(15)  編輯  收藏 所屬分類: javaspring 原創webservice

          評論

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService  回復  更多評論   

          我按照你在文中的說明一步步進行,可是最后啟動tomcat,最后發現沒有成功部署此webservice。也看見什么異常出來,這是什么原因呢?
          2009-04-29 14:22 | Sophie

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService  回復  更多評論   

          需要在web.xmll文件中加入下面內容,加了吧?
          <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>
          2009-04-29 15:13 | 銀河使者

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService  回復  更多評論   

          加了。我看tomcat的啟動日志,確實也成功讀取WEB-INF/applicationContext.xml這個文件了。
          2009-04-30 09:43 | Sophie

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService[未登錄]  回復  更多評論   

          我按照你上面的方法做,在ie里面能反問,沒有任何錯誤,但是新建一個客戶端(eclipse中自動生成的)調用這個webservice時,SpringServicePortType.java這個類里面的方法返回的參數類型是XXX.GetPersonResponse(期待類型應是java.lang.String).請問這是為什么呀???
          2009-05-14 15:54 | aa

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService  回復  更多評論   

          axis2把有些簡單類型封裝到一個類中了,你看看自動生成的stub類,里面有類型所指定的類,你建立個對象,賦一下值就可以了。
          2009-05-14 16:10 | 銀河使者

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService[未登錄]  回復  更多評論   

          我的SpringServicePortType.java這個類里面的方法的返回類型照理應該全部是java.lang.String,但是現在只有第一個不是java.lang.String而是XXX.GetPersonResponse,其他的幾個方法返回的類型都是正確的。不明白為什么?
          2009-05-14 16:29 | aa

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService  回復  更多評論   

          好文章,受益了。
          再指出一點注意的地方,
          <parameter name="ServiceObjectSupplier"> org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier
          </parameter>
          里面的類一定不要寫錯,在別的文章里看到有用別的類的,可能是不用場合。如果運行有問題,可以考慮下這個地方。
          2009-05-30 23:03 | wqyang

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService  回復  更多評論   

          我照你寫的做的,可以啟動TOMCAT的時候報這個錯誤,ERROR] Context initialization failed
          org.springframework.beans.factory.BeanDefinitionStoreException: Line 9 in XML document from ServletContext resource [/WEB-INF/applicationContext.xml] is invalid; nested exception is org.xml.sax.SAXParseException: Document root element "beans", must match DOCTYPE root "null".
          2009-07-17 13:28 | mumu

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService  回復  更多評論   

          可能是寫錯了,把你寫的貼上來看看。配置文件。
          2009-07-17 14:09 | 銀河使者

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService  回復  更多評論   

          @mumu
          Spring.jar 包問題,解析applicationContext.xml文件出錯了。
          2009-07-27 14:48 | Elimin

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService[未登錄]  回復  更多評論   

          你好,我部署的時候發生這個錯誤怎么回事啊?
          [ERROR] Context initialization failed
          org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [service.SpringService] for bean with name 'springService' defined in ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.lang.ClassNotFoundException: service.SpringService
          2009-12-14 18:49 | laimu

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService  回復  更多評論   

          幫我看看一個異常可以嗎?在線等

          org.apache.axis2.deployment.DeploymentException: The following error occurred during schema generation: null
          at org.apache.axis2.deployment.ServiceGroupBuilder.populateServiceGroup(ServiceGroupBuilder.java:106)
          at org.apache.axis2.deployment.repository.util.ArchiveReader.buildServiceGroup(ArchiveReader.java:110)
          at org.apache.axis2.deployment.repository.util.ArchiveReader.processServiceGroup(ArchiveReader.java:179)
          at org.apache.axis2.deployment.ServiceDeployer.deploy(ServiceDeployer.java:81)
          at org.apache.axis2.deployment.repository.util.DeploymentFileData.deploy(DeploymentFileData.java:136)
          at org.apache.axis2.deployment.DeploymentEngine.doDeploy(DeploymentEngine.java:597)
          at org.apache.axis2.deployment.repository.util.WSInfoList.update(WSInfoList.java:144)
          at org.apache.axis2.deployment.RepositoryListener.update(RepositoryListener.java:330)
          at org.apache.axis2.deployment.RepositoryListener.checkServices(RepositoryListener.java:227)
          at org.apache.axis2.deployment.DeploymentEngine.loadServices(DeploymentEngine.java:131)
          at org.apache.axis2.deployment.FileSystemConfigurator.loadServices(FileSystemConfigurator.java:147)
          at org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContext(ConfigurationContextFactory.java:82)
          at org.apache.axis2.context.ConfigurationContextFactory.createConfigurationContextFromFileSystem(ConfigurationContextFactory.java:184)
          at com.ncs.saas.comm.message.WebServiceClient.main(WebServiceClient.java:26)
          Caused by: org.apache.axis2.deployment.DeploymentException: The following error occurred during schema generation: null
          at org.apache.axis2.deployment.ServiceBuilder.populateService(ServiceBuilder.java:431)
          at org.apache.axis2.deployment.ServiceGroupBuilder.populateServiceGroup(ServiceGroupBuilder.java:101)
          ... 13 more
          Caused by: org.apache.axis2.deployment.DeploymentException: The following error occurred during schema generation: null
          at org.apache.axis2.deployment.ServiceBuilder.populateService(ServiceBuilder.java:394)
          ... 14 more
          Caused by: java.security.PrivilegedActionException: java.lang.reflect.InvocationTargetException
          at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:136)
          at org.apache.axis2.deployment.util.Utils.fillAxisService(Utils.java:485)
          at org.apache.axis2.deployment.ServiceBuilder.populateService(ServiceBuilder.java:386)
          ... 14 more
          Caused by: java.lang.reflect.InvocationTargetException
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:597)
          at org.apache.axis2.deployment.util.Utils$16.run(Utils.java:491)
          at org.apache.axis2.java.security.AccessController.doPrivileged(AccessController.java:132)
          ... 16 more
          Caused by: org.apache.axis2.AxisFault: Axis2 Can't find ServletConfigParameter
          at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
          at org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier.getServiceObject(SpringServletContextObjectSupplier.java:86)
          ... 22 more
          Caused by: java.lang.Exception: Axis2 Can't find ServletConfigParameter
          at org.apache.axis2.extensions.spring.receivers.SpringServletContextObjectSupplier.getServiceObject(SpringServletContextObjectSupplier.java:62)
          ... 22 more
          2010-01-15 11:06 | huajian

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService  回復  更多評論   

          如果我不希望Spring封裝的Bean的所有Public方法都公布成WebService,是不是我需要用Operate Tag來配置,而不能使用
          <messageReceivers>
          <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"
          class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" />
          </messageReceivers>
          2010-09-11 10:57 | A.L

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService  回復  更多評論   

          我跟著您的步驟做了,雖然配置成功,http://localhost:8080/axis2/services/springService?wsdl也輸出了結果,但是我卻沒在當中找到applicationContext.xml中springService bean初始化的姚明、中國男藍信息,如果是沒有的話那么這個初始化有何作用呢?如何輸出這個初始化信息?
          2014-05-23 10:22 | skyman531

          # re: WebService大講堂之Axis2(7):將Spring的裝配JavaBean發布成WebService  回復  更多評論   

          很好,就是有一點,原文中的將上面兩個Java源文件編譯后,放到<Tomcat安裝目錄>\webapps\axis2\WEB-INF\classes目錄中。應該要加上各自的包,就是要多建兩個文件夾,把class文件分別放到對應的目錄中去。
          2014-07-28 11:22 | yyyyy
          主站蜘蛛池模板: 荔波县| 博乐市| 本溪市| 如皋市| 长阳| 天祝| 沾化县| 垣曲县| 洪雅县| 平罗县| 吉安县| 利辛县| 乌恰县| 酒泉市| 东丽区| 雷州市| 昭觉县| 贺州市| 三台县| 大渡口区| 吉木萨尔县| 化德县| 阿瓦提县| 柳林县| 乳源| 郯城县| 平塘县| 阳泉市| 施甸县| 双鸭山市| 明星| 阳西县| 江都市| 武威市| 信阳市| 巧家县| 敖汉旗| 永吉县| 滕州市| 扶绥县| 五常市|