服務使用CXF架構用戶端使用Axis2架構的webservice實現方案

來源:互聯網
上載者:User

背景:

      運行在兩台獨立伺服器上的兩個web服務,其中一個web服務需要訪問另一個web服務的業務方法。但是兩個服務各自的運行環境不同,一個服務運行在jdk1.5上(服務端),使用spring2.5.6架構管理bean,而另一個運行在jdk1.4環境下(用戶端)。現在要求通過webservice技術讓用戶端能訪問服務端提供的webservice服務。

方案:

     服務端因為使用了spring,故使用Apache CXF架構將業務bean的方法發布為webservice服務 ,用戶端使用支援jdk1.4的Axis2-1.4.1,產生服務端業務方法的用戶端存根,提供用戶端使用。

 

備忘:此方案對保證服務安全尚未有良好解決方案,對安全有要求請不要參考!

 

環境

 IDE:Eclipse3.5

 服務端:jdk1.5 , CXF2.2.4 (http://cxf.apache.org/download.html ), spring2.5.6 ,Tomcat6.0

 用戶端:jdk1.4 , Axis2-1.4.1( http://ws.apache.org/axis2/download/1_4_1/download.cgi )

 代碼產生工具:axis2-eclipse-codegen-wizard.zip和axis2-eclipse-service-archiver-wizard.zip,http://apache.justdn.org/ws/axis2/tools/1_4_1/

 

 

 

 

服務端:

 發布一個webservice服務,

 1.jar包 ,參考如片

 

 

 2.實體類Person.java

package com.webservice.entity;<br />import java.io.Serializable;<br />public class Person implements Serializable{<br />private static final long serialVersionUID = 1L;<br />private Integer id;<br />private String name;<br />public Integer getId() {<br />return id;<br />}<br />public void setId(Integer id) {<br />this.id = id;<br />}<br />public String getName() {<br />return name;<br />}<br />public void setName(String name) {<br />this.name = name;<br />}<br />}<br />

 

 3.服務類和介面定義

介面 PersonService.java

 package com.webservice.service;<br />import java.util.List;<br />import javax.jws.WebMethod;<br />import javax.jws.WebService;<br />import com.webservice.entity.Person;<br />@WebService(targetNamespace="impl.service.webservice.com",name ="PersonService" )<br />public interface PersonService {<br />/* (non-Javadoc)<br /> * @see com.sds.service.IPersonService#save()<br /> */<br />@WebMethod(operationName ="save")<br />public abstract void save(String name);</p><p>@WebMethod(operationName ="getPersonList")<br />//注意此處一定要指明List元素類型<br />public abstract List<Person> getPersonList();<br />}

 

類PersonServiceImpl.java

 package com.webservice.service.impl;<br />import java.util.ArrayList;<br />import java.util.List;<br />import javax.jws.WebService;<br />import com.webservice.entity.Person;<br />import com.webservice.service.PersonService;<br />@WebService(endpointInterface = "com.webservice.service.PersonService" )<br />public class PersonServiceImpl implements PersonService {<br /> /* (non-Javadoc)<br /> * @see com.sds.service.IPersonService#save()<br /> */<br /> /* (non-Javadoc)<br /> * @see com.webservice.service.IPersonService#save(java.lang.String)<br /> */<br /> public void save(String name){<br /> System.out.println("name:"+name+" successfully saved!");<br /> }<br />/* (non-Javadoc)<br /> * @see com.webservice.service.IPersonService#getPersonList()<br /> */<br />public List<Person> getPersonList() {<br />List<Person> list=new ArrayList<Person>();<br />Person person=new Person();<br />person.setId(1);<br />person.setName("jack0511");<br />list.add(person);<br />person=new Person();<br />person.setId(2);<br />person.setName("Lucy");<br />list.add(person);<br />return list;<br />}<br />}<br />

 

 4.bean配置

 <?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:context="http://www.springframework.org/schema/context "
       xmlns:aop="http://www.springframework.org/schema/aop "
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.5.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.5.xsd ">
              
     <context:annotation-config/>
     <bean id="personService" class="com.webservice.service.impl.PersonServiceImpl"/>
</beans>

 

 5.cxf設定檔

applicationContext-cxf.xml

 

<?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:jaxws="http://cxf.apache.org/jaxws "
              xsi:schemaLocation="
                  http://www.springframework.org/schema/beans
                  http://www.springframework.org/schema/beans/spring-beans.xsd
                  http://cxf.apache.org/jaxws
                  http://cxf.apache.org/schemas/jaxws.xsd "
                  default-autowire="byName" default-lazy-init="true">
 <import resource="classpath:META-INF/cxf/cxf.xml" />
 <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
 <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <bean id="jaxWsServiceFactoryBean" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean" scope="prototype">
            <property name="wrapped" value="true"/>
            <property name="dataBinding" ref="aegisBean"/>
            <property name="serviceConfigurations">
               <list>
                 <bean class="org.apache.cxf.jaxws.support.JaxWsServiceConfiguration"/>
                 <bean class="org.apache.cxf.aegis.databinding.AegisServiceConfiguration"/>
                 <bean class="org.apache.cxf.service.factory.DefaultServiceConfiguration"/>
               </list>
             </property>
     </bean>
     <bean id="aegisBean" class="org.apache.cxf.aegis.databinding.AegisDatabinding"/>
  
        <jaxws:endpoint id="WSpersonService" implementor="#personService" address="/PersonService">
          <jaxws:serviceFactory>
            <ref bean="jaxWsServiceFactoryBean"/>
          </jaxws:serviceFactory>
     </jaxws:endpoint>
 </beans>

 

 

4.web.xml配置CXFServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance " xmlns="http://java.sun.com/xml/ns/javaee " xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd " xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd " id="WebApp_ID" version="2.5">
  <display-name>CXFService</display-name>
  <context-param>
   <param-name>contextConfigLocation</param-name>
   <param-value>classpath:applicationContext*.xml</param-value>
  </context-param>
  <listener>
  <listener-class>
   org.springframework.web.context.ContextLoaderListener
  </listener-class>
  </listener>
  <servlet>
  <servlet-name>CXFServlet</servlet-name>
  <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  <servlet-name>CXFServlet</servlet-name>
  <url-pattern>/services/*</url-pattern>
 </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

 

5.測試服務端

 啟動Tomcat,在瀏覽器地址欄輸入:http://localhost:8080/CXFService/services ,看到如下頁面

 

 

 點選連結進入,可以查看服務的wsdl

 

 

至此服務發布成功!

 

 

用戶端:(這裡用戶端只用java工程進行測試,web工程同理)

1.建立一個java project 命名為CxfServiceClient(如果需要在jdk1.4下運行,請將編譯層級改為jdk1.4,否則忽略)

 

 

 

2.產生用戶端代碼

按照以下操作步驟進行:

 

 

 

 

選擇Axis2 Code Generator,將PersonService的wsdl地址拷貝到以下輸入框:

 

 

選擇如下的參數:

 

 

 

繼續點擊Next,進入如下視窗,選擇用戶端工程根路徑為代碼產生路徑,選擇Axis2的lib匯入到用戶端工程(可選的步驟):

 

 

 

最後finish:

 

 

 

 

如果產生代碼報錯,請在外掛程式中lib下加入stax-api-1.0.1.jar和backport-util-concurrent-3.1.jar,檢查plugin.xml是否配置這兩項,然後重啟eclipse

 

 

代碼產生完畢,這時會發現代碼上有錯誤提示,原因是axis2的jar包還沒有引入,將CxfServiceClient/lib下的jar包引入classpath即可解決此錯誤。

 

可以發現,針對List的資料類型,Axis2實際上是產生了ArrayOfPerson的類,將List轉換成了對象數組進行處理!

 

 

3.寫測試案例執行測試

 在產生的測試代碼上完善測試邏輯,將產生的test包拖拽到src下,完成兩個測試方法的代碼,樣本:

public void testgetPersonList() throws java.lang.Exception{<br /> com.webservice.service.impl.PersonServiceImplServiceStub stub =<br /> new com.webservice.service.impl.PersonServiceImplServiceStub();//the default implementation should point to the right endpoint<br /> com.webservice.service.impl.GetPersonListDocument getPersonList8=<br /> (com.webservice.service.impl.GetPersonListDocument)getTestObject(com.webservice.service.impl.GetPersonListDocument.class);<br /> // TODO : Fill in the getPersonList8 here<br /> getPersonList8.addNewGetPersonList();<br /> ArrayOfPerson arrayOfPerson=stub.getPersonList(getPersonList8).getGetPersonListResponse().getReturn();<br /> Person[] persons=arrayOfPerson.getPersonArray();<br /> if(persons!=null&&persons.length>0){<br /> for(int i=0;i<persons.length;i++){<br /> System.out.println("id:"+persons[i].getId()+"--------name:"+persons[i].getName());<br /> }<br /> }<br /> }<br /> public void testsave() throws java.lang.Exception{<br /> com.webservice.service.impl.PersonServiceImplServiceStub stub =<br /> new com.webservice.service.impl.PersonServiceImplServiceStub();//the default implementation should point to the right endpoint<br /> com.webservice.service.impl.SaveDocument save10=<br /> (com.webservice.service.impl.SaveDocument)getTestObject(com.webservice.service.impl.SaveDocument.class);<br /> save10.addNewSave();<br /> save10.getSave().setArg0("Linda");<br /> stub.save(save10);<br /> }

 

 

執行測試,報錯,

java.lang.reflect.InvocationTargetException
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at test.com.webservice.service.impl.PersonServiceImplServiceTest.getTestObject(PersonServiceImplServiceTest.java:130)
 at test.com.webservice.service.impl.PersonServiceImplServiceTest.testsave(PersonServiceImplServiceTest.java:74)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at junit.framework.TestCase.runTest(TestCase.java:164)
 at junit.framework.TestCase.runBare(TestCase.java:130)
 at junit.framework.TestResult$1.protect(TestResult.java:106)
 at junit.framework.TestResult.runProtected(TestResult.java:124)
 at junit.framework.TestResult.run(TestResult.java:109)
 at junit.framework.TestCase.run(TestCase.java:120)
 at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ExceptionInInitializerError
 at com.webservice.service.impl.SaveDocument$Factory.newInstance(SaveDocument.java:45)
 ... 22 more
Caused by: java.lang.RuntimeException: Cannot load SchemaTypeSystem. Unable to load class with name schemaorg_apache_xmlbeans.system.s5EA05717581B4DB0D124E78F071F0690.TypeSystemHolder. Make sure the generated binary files are on the classpath.
 at org.apache.xmlbeans.XmlBeans.typeSystemForClassLoader(XmlBeans.java:783)
 at com.webservice.service.impl.SaveDocument.<clinit>(SaveDocument.java:20)
 ... 23 more
Caused by: java.lang.ClassNotFoundException: schemaorg_apache_xmlbeans.system.s5EA05717581B4DB0D124E78F071F0690.TypeSystemHolder
 at java.net.URLClassLoader$1.run(Unknown Source)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at org.apache.xmlbeans.XmlBeans.typeSystemForClassLoader(XmlBeans.java:769)
 ... 24 more

 

解決方案 :將產生的CxfServiceClient/resources/schemaorg_apache_xmlbeans拷貝到class編譯路徑下,我這裡是bin目錄下,,

 

 

再執行,提示成功!

 

 

 

參考文檔:http://cxf.apache.org/docs/writing-a-service-with-spring.html

 

轉載請註明出處http://blog.csdn.net/jack0511/archive/2009/11/06/4775691.aspx,謝謝!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.