posts - 28,  comments - 13,  trackbacks - 0
          現在的項目中需要用到SOA概念的地方越來越多,最近我接手的一個項目中就提出了這樣的業務要求,需要在.net開發的客戶端系統中訪問java開發的web系統,這樣的業務需求自然需要通過WebService進行信息數據的操作。下面就將我們在開發中摸索的一點經驗教訓總結以下,以供大家參考.

          我們項目的整個架構使用的比較流行的WSH MVC組合,即webwork2 + Spring + Hibernate;
          1.首先集成Apacha CXF WebService 到 Spring 框架中;
          apache cxf 下載地址:http://people.apache.org/dist/incubator/cxf/2.0.4-incubator/apache-cxf-2.0.4-incubator.zip
          在spring context配置文件中引入以下cxf配置
          	<import resource="classpath*:META-INF/cxf/cxf.xml" />
          <import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />
          <import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />

          在web.xml中添加過濾器:
          	<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>


          2.開發服務端WebService接口:
          /**
          * WebService接口定義類.
          *
          * 使用@WebService將接口中的所有方法輸出為Web Service.
          * 可用annotation對設置方法、參數和返回值在WSDL中的定義.
          */
          @WebService
          public interface WebServiceSample {


          /**
          * 一個簡單的方法,返回一個字符串
          * @param hello
          * @return
          */
          String say(String hello);

          /**
          * 稍微復雜一些的方法,傳遞一個對象給服務端處理
          * @param user
          * @return
          */
          String sayUserName(
          @WebParam(name = "user")
          UserDTO user);

          /**
          * 最復雜的方法,返回一個List封裝的對象集合
          * @return
          */
          public
          @WebResult(partName="o")
          ListObject findUsers();

          }

          由簡單到復雜定義了三個接口,模擬業務需求;

          3.實現接口
          /**
          * WebService實現類.
          *
          * 使用@WebService指向Interface定義類即可.
          */
          @WebService(endpointInterface = "cn.org.coral.biz.examples.webservice.WebServiceSample")
          public class WebServiceSampleImpl implements WebServiceSample {

          public String sayUserName(UserDTO user) {
          return "hello "+user.getName();
          }

          public String say(String hello) {
          return "hello "+hello;
          }

          public ListObject findUsers() {
          ArrayList<Object> list = new ArrayList<Object>();

          list.add(instancUser(1,"lib"));
          list.add(instancUser(2,"mld"));
          list.add(instancUser(3,"lq"));
          list.add(instancUser(4,"gj"));
          ListObject o = new ListObject();
          o.setList(list);
          return o;
          }

          private UserDTO instancUser(Integer id,String name){
          UserDTO user = new UserDTO();
          user.setId(id);
          user.setName(name);
          return user;
          }
          }


          4.依賴的兩個類:用戶對象與List對象
          /**
          * Web Service傳輸User信息的DTO.
          *
          * 分離entity類與web service接口間的耦合,隔絕entity類的修改對接口的影響.
          * 使用JAXB 2.0的annotation標注JAVA-XML映射,盡量使用默認約定.
          *
          */
          @XmlAccessorType(XmlAccessType.FIELD)
          @XmlType(name = "User")
          public class UserDTO {

          protected Integer id;

          protected String name;

          public Integer getId() {
          return id;
          }

          public void setId(Integer value) {
          id = value;
          }

          public String getName() {
          return name;
          }

          public void setName(String value) {
          name = value;
          }
          }

          關于List對象,參照了有關JWS的一個問題中的描述:DK6.0 自帶的WebService中 WebMethod的參數好像不能是ArrayList 或者其他List
          傳遞List需要將List 包裝在其他對象內部才行 (個人理解 如有不對請指出) ,我在實踐中也遇到了此類問題.通過以下封裝的對象即可以傳遞List對象.
          /**
          * <p>Java class for listObject complex type.
          *
          * <p>The following schema fragment specifies the expected content contained within this class.
          *
          * <pre>
          * <complexType name="listObject">
          * <complexContent>
          * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
          * <sequence>
          * <element name="list" type="{http://www.w3.org/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/>
          * </sequence>
          * </restriction>
          * </complexContent>
          * </complexType>
          * </pre>
          *
          *
          */
          @XmlAccessorType(XmlAccessType.FIELD)
          @XmlType(name = "listObject", propOrder = { "list" })
          public class ListObject {

          @XmlElement(nillable = true)
          protected List<Object> list;

          /**
          * Gets the value of the list property.
          *
          * <p>
          * This accessor method returns a reference to the live list,
          * not a snapshot. Therefore any modification you make to the
          * returned list will be present inside the JAXB object.
          * This is why there is not a <CODE>set</CODE> method for the list property.
          *
          * <p>
          * For example, to add a new item, do as follows:
          * <pre>
          * getList().add(newItem);
          * </pre>
          *
          *
          * <p>
          * Objects of the following type(s) are allowed in the list
          * {@link Object }
          *
          *
          */
          public List<Object> getList() {
          if (list == null) {
          list = new ArrayList<Object>();
          }
          return this.list;
          }

          public void setList(ArrayList<Object> list) {
          this.list = list;
          }

          }


          5.WebService 服務端 spring 配置文件 ws-context.xml
          <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://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd"
          default-autowire="byName" default-lazy-init="true">

          <jaxws:endpoint id="webServiceSample"
          address="/WebServiceSample" implementor="cn.org.coral.biz.examples.webservice.WebServiceSampleImpl"/>

          </beans>


          WebService 客戶端 spring 配置文件 wsclient-context.xml
          <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://cxf.apache.org/jaxws
          http://cxf.apache.org/schemas/jaxws.xsd
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans.xsd"
          default-autowire="byName" default-lazy-init="true">

          <!-- ws client -->
          <bean id="identityValidateServiceClient" class="cn.org.coral.admin.service.IdentityValidateService"
          factory-bean="identityValidateServiceClientFactory" factory-method="create" />

          <bean id="identityValidateServiceClientFactory"
          class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
          <property name="serviceClass"
          value="cn.org.coral.admin.service.IdentityValidateService" />
          <property name="address"
          value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/>
          </bean>

          </beans>

          6.發布到tomcat服務器以后通過以下地址即可查看自定義的webservice接口生成的wsdl:
          http://88.148.29.54:8080/aio/services/WebServiceSample?wsdl

          7.調用WebService接口的Junit單元測試程序
          package test.coral.sample;

          import org.springframework.test.AbstractDependencyInjectionSpringContextTests;

          import cn.org.coral.biz.examples.webservice.WebServiceSample;
          import cn.org.coral.biz.examples.webservice.dto.UserDTO;

          public class TestWebServiceSample extends
          AbstractDependencyInjectionSpringContextTests {
          WebServiceSample webServiceSampleClient;

          public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {
          this.webServiceSampleClient = webServiceSampleClient;
          }

          @Override
          protected String[] getConfigLocations() {
          setAutowireMode(AUTOWIRE_BY_NAME);
          //spring 客戶端配置文件保存位置
          return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };
          }

          public void testWSClinet(){
          Assert.hasText(webServiceSampleClient.say(" world"));
          }
          }

          posted on 2008-03-16 21:40 Lib 閱讀(39147) 評論(5)  編輯  收藏 所屬分類: Java


          FeedBack:
          # Virusnyi Marketing
          2009-05-18 08:18 | Virusnyi Marketing
          Hi everyone. Our deeds determine us, as much as we determine our deeds.
          I am from Vietnam and learning to write in English, give true I wrote the following sentence: "Seo india wildnet technologies is india based seo india company, a seo india company providing cheap seo services in india.Search engine optimization pay per click ppc management post click marketing."

          With respect :P, Kala.  回復  更多評論
            
          # re: WebService開發筆記 1 -- 利用cxf開發WebService竟然如此簡單
          2011-08-02 16:14 | 靚女購物街
          最近項目用到CXF做開發,學習下,謝謝  回復  更多評論
            
          # re: WebService開發筆記 1 -- 利用cxf開發WebService竟然如此簡單
          2011-11-23 11:04 | wanxkl
          不錯。,謝謝了  回復  更多評論
            
          # re: WebService開發筆記 1 -- 利用cxf開發WebService竟然如此簡單
          2012-06-07 16:30 | 鵝鵝鵝
          公司的分公司的  回復  更多評論
            
          # re: WebService開發筆記 1 -- 利用cxf開發WebService竟然如此簡單
          2014-12-22 15:05 | sd
          sdasd  回復  更多評論
            
          <2011年8月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910



          我的JavaEye博客
          http://lib.javaeye.com


          常用鏈接

          留言簿(2)

          隨筆分類

          文章分類

          FLASH

          Java

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 郓城县| 来安县| 东海县| 琼结县| 呈贡县| 新野县| 红河县| 诸暨市| 浠水县| 大荔县| 探索| 武乡县| 德惠市| 河源市| 合山市| 黎川县| 长乐市| 鄂州市| 汝城县| 宁远县| 麻江县| 北碚区| 米林县| 高唐县| 岳西县| 华阴市| 怀远县| 疏附县| 南阳市| 黄骅市| 永福县| 五峰| 若尔盖县| 吉林省| 开封县| 中江县| 龙陵县| 阿瓦提县| 开鲁县| 兰考县| 吴旗县|