<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    E81086713E446D36F62B2AA2A3502B5EB155

    Java雜家

    雜七雜八。。。一家之言

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      40 Posts :: 1 Stories :: 174 Comments :: 0 Trackbacks
    (感覺BlogJava很有人氣,就把原來寫在msn space上的也轉過來)

    通常在Spring發布Hession,RMI等,是非常方便的,

    但是要發布SOAP類型的WebService則要依賴一個獨立的Servlet容器(如Tomcat+Axis),

    這種Webservice一般還有別的配置文件,比如web.xml,wsdd文件等等
    。有時侯,你可能想一臺機器上只部署一個Http Soap Service
    ,這種場合你可能不希望安裝一個類似Tomcat的容器,
    你更希望發布的時候就是一個服務程序,該程序啟動則提供WebService.這篇文章描述一種解決方案。
    開發環境:
    Spring 1.2.6
    XFire 1.0
    Jetty 4.2.1
    方案描述:我們可以通過XFire的編程接口來創建WebService并嵌入一個HttpServer,
    從而來做到在一個獨立應用程序中發布Http Service
    ?1//?Create?an?XFire?Service
    ?2????????ObjectServiceFactory?serviceFactory?=?new?ObjectServiceFactory();
    ?3????????Service?service?=?serviceFactory.create(Echo.class);
    ?4????????service.setInvoker(new?BeanInvoker(new?EchoImpl()));
    ?5????????//?Register?the?service?in?the?ServiceRegistry
    ?6????????XFire?xfire?=?XFireFactory.newInstance().getXFire();
    ?7????????xfire.getServiceRegistry().register(service);
    ?8????????//?Start?the?HTTP?server
    ?9????????XFireHttpServer?server?=?new?XFireHttpServer();
    10????????server.setPort(8191);
    11????????server.start();

    這樣的話,如果發布多個WebSerice則要依次顯式的創建 XFire Service,然后再一一注冊,

    這樣顯然是不夠優雅的。

    我們想要讓開發者在Spring配置文件中指定要發布為WebService的POJOs,

    然后載入Spring環境就自動發布為webservice,而不需要跟 XFire API打交道。

    首先,我們想要一個BeanFacory,能把一個pojo裝配成XFire Service

    ?1?/**
    ?2??*?
    ?3??*/
    ?4?package?com.yovn.ws.xfire.example;
    ?5?
    ?6?import?org.codehaus.xfire.service.Service;
    ?7?import?org.codehaus.xfire.service.binding.BeanInvoker;
    ?8?import?org.codehaus.xfire.service.binding.ObjectServiceFactory;
    ?9?import?org.springframework.beans.factory.FactoryBean;
    10?
    11?/**
    12??*?@author?new
    13??*
    14??*/
    15?public?class?XFireServiceFactoryBean?implements?FactoryBean
    16?{
    17?
    18?????
    19?????
    20?????
    21?????private?Class?serviceClass;
    22?????
    23?????
    24?????private?Object?target;
    25?????
    26?????
    27?????private?Service?service;
    28?????
    29?????
    30?????private?final?ObjectServiceFactory?sf=new?ObjectServiceFactory();
    31?????
    32?????/**
    33??????*?
    34??????*/
    35?????public?XFireServiceFactoryBean()
    36?????{
    37?????????
    38?????}
    39?
    40?????/*?(non-Javadoc)
    41??????*?@see?org.springframework.beans.factory.FactoryBean#getObject()
    42??????*/
    43?????public?Object?getObject()?throws?Exception
    44?????{
    45?????????if(service==null)
    46?????????{
    47?????????????service=sf.create(serviceClass);
    48?????????????service.setInvoker(new?BeanInvoker(target));
    49?????????}
    50?????????return?service;
    51?????}
    52?
    53?????/*?(non-Javadoc)
    54??????*?@see?org.springframework.beans.factory.FactoryBean#getObjectType()
    55??????*/
    56?????public?Class?getObjectType()
    57?????{
    58?????????
    59?????????return?Service.class;
    60?????}
    61?
    62?????/*?(non-Javadoc)
    63??????*?@see?org.springframework.beans.factory.FactoryBean#isSingleton()
    64??????*/
    65?????public?boolean?isSingleton()
    66?????{
    67?????????return?true;
    68?????}
    69?
    70?????public?void?setServiceClass(Class?serviceClass)
    71?????{
    72?????????this.serviceClass?=?serviceClass;
    73?????}
    74?
    75?????public?void?setTarget(Object?target)
    76?????{
    77?????????this.target?=?target;
    78?????}
    79?
    80?}
    81?

    這樣我們可以通過Spring來裝配一個pojo,

    下一步我們要在Spring容器載入時候注冊XFire Service,

    并啟動一個嵌入的Http Server,我們可以借助Spring的ApplicationListener來實現

    ?1?/**
    ?2??*?
    ?3??*/
    ?4?package?com.yovn.ws.xfire.example;
    ?5?
    ?6?
    ?7?import?org.apache.commons.logging.Log;
    ?8?import?org.apache.commons.logging.LogFactory;
    ?9?import?org.codehaus.xfire.XFire;
    10?import?org.codehaus.xfire.XFireFactory;
    11?import?org.codehaus.xfire.server.http.XFireHttpServer;
    12?import?org.codehaus.xfire.service.Service;
    13?import?org.codehaus.xfire.service.ServiceRegistry;
    14?import?org.springframework.context.ApplicationContext;
    15?import?org.springframework.context.ApplicationEvent;
    16?import?org.springframework.context.ApplicationListener;
    17?import?org.springframework.context.event.ContextClosedEvent;
    18?import?org.springframework.context.event.ContextRefreshedEvent;
    19?
    20?/**
    21??*?@author?new
    22??*?
    23??*/
    24?public?class?XFireServiceStarter?implements?ApplicationListener
    25?{
    26?
    27?????private?int?port?=?80;
    28?
    29?????private?XFireHttpServer?server;
    30?????private?final?Log?logger=LogFactory.getLog(getClass().getName());
    31?
    32?????public?void?setPort(int?port)
    33?????{
    34?????????this.port?=?port;
    35?????}
    36?
    37?????public?void?onApplicationEvent(ApplicationEvent?event)
    38?????{
    39?????????try
    40?????????{
    41?????????????if?(event?instanceof?ContextRefreshedEvent)
    42?????????????{
    43?
    44?????????????????if?(server?!=?null)
    45?????????????????{
    46?
    47?????????????????????server.stop();
    48?????????????????????logger.info("xfire?server?stopped");
    49?
    50?????????????????}
    51?????????????????registerService((ApplicationContext)event.getSource());
    52?????????????????server?=?new?XFireHttpServer();
    53?????????????????server.setPort(port);
    54?????????????????server.start();
    55?????????????????logger.info("xfire?server?started");
    56?
    57?????????????}?else?if?(event?instanceof?ContextClosedEvent)
    58?????????????{
    59??????????????????if(server!=null)
    60??????????????????{
    61??????????????????????server.stop();
    62??????????????????????logger.info("xfire?server?stopped");
    63??????????????????}
    64??????????????????
    65?????????????}
    66?
    67?????????}?catch?(Exception?e)
    68?????????{
    69?????????????logger.error("process?event?"+event+"?error",e);
    70?????????}
    71?
    72?????}
    73?
    74?????private?void?registerService(ApplicationContext?context)
    75?????{
    76?????????XFire?xfire=XFireFactory.newInstance().getXFire();
    77?????????ServiceRegistry?registry=xfire.getServiceRegistry();
    78?????????String?names[]=context.getBeanNamesForType(Service.class);
    79?????????
    80?????????for(int?i=0;i<names.length;i++)
    81?????????{
    82?????????????Service?service=(Service)context.getBean(names[i]);
    83?????????????registry.register(service);
    84?????????????logger.info("register?service:"+service.getName());
    85?????????}
    86?????????
    87?????}
    88?
    89?}
    90?

    Ok,我們完成基礎的代碼,下面試著發布一個簡單的WebServie
    1?package?com.yovn.ws.xfire.example;
    2?
    3?public?interface?Add
    4?{
    5?????int?add(int?a,int?b);
    6?
    7?}
    該接口的實現如下
    ?1?package?com.yovn.ws.xfire.example;
    ?2?
    ?3?public?class?AddImpl?implements?Add
    ?4?{
    ?5?
    ?6?????public?int?add(int?a,?int?b)
    ?7?????{
    ?8?????????
    ?9?????????return?a+b;
    10?????}
    11?
    12?}

    這是一個簡單功能的POJO,下面我們在Spring中裝配起來
    ?1?<?xml?version="1.0"?encoding="UTF-8"?>
    ?2?<!DOCTYPE?beans?PUBLIC?"-//SPRING//DTD?BEAN//EN"?"http://www.springframework.org/dtd/spring-beans.dtd">
    ?3?<beans>
    ?4?????<bean?id="addService"?class="com.yovn.ws.xfire.example.XFireServiceFactoryBean">
    ?5?????????<property?name="serviceClass"?value="com.yovn.ws.xfire.example.Add"/>
    ?6?????????<property?name="target"?ref="adder"/>
    ?7?????</bean>
    ?8?????
    ?9?????<bean?id="adder"?class="com.yovn.ws.xfire.example.AddImpl"/>
    10?????<bean?id="xfireStarter"?class="com.yovn.ws.xfire.example.XFireServiceStarter">
    11????????<property?name="port"?value="80"/>
    12?????</bean>
    13?</beans>

    好了,我們完成了,只要載入這個xml初始化一個Spring ApplicationContext,一個名叫Add的webservice就發布了。你可以通過訪問http://localhost/Add?wsdl來獲得webservice的詳細描述!
    posted on 2007-01-07 17:55 DoubleH 閱讀(5684) 評論(4)  編輯  收藏

    Feedback

    # re: 在Spring中發布SOAP HTTP Webservice 2007-01-08 13:15 DoubleHeart
    朋友,我照著你的方法試了試,
    可總是報這樣的錯誤:
    Internal Server Error
    RequestURI=/Addition

    我第一次弄WebService,很多地方都不明白,麻煩您幫幫我。  回復  更多評論
      

    # re: 在Spring中發布SOAP HTTP Webservice 2007-01-08 15:20 Javacap
    @DoubleHeart
    檢查一下服務器端報的什么錯誤,從瀏覽器很難看出來的。
    看看是不是找不到類,或則是什么別的異常。  回復  更多評論
      

    # re: 在Spring中發布SOAP HTTP Webservice 2007-01-08 15:26 DoubleHeart
    服務器端是正常的,沒有拋出任何異常。
    甚至在響應請求時么有輸出任何信息(應該就沒有響應請求——Invalid SOAP request.)

    我的msn: doubleheartz@gmail.com
    這樣說起來方便些。
    *^_^*  回復  更多評論
      

    # re: 在Spring中發布SOAP HTTP Webservice 2007-01-08 15:44 DoubleHeart
    對了,還要再麻煩您一下,您能不能把您的這個例子代碼打一個可發布的war給我一份兒呀,我也好看看我哪兒不對。
    謝了。  回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲网站免费观看| 亚洲AV网一区二区三区| 日本高清免费aaaaa大片视频| 亚洲AV日韩综合一区| 国精无码欧精品亚洲一区| 成年人免费的视频| 免费在线观看一区| 亚洲福利电影在线观看| 免费一级毛片不卡不收费| 久久久久久久岛国免费播放| 亚洲性无码AV中文字幕| 亚洲国产精品无码专区| 成人毛片免费视频| 玖玖在线免费视频| 国产成人亚洲精品91专区高清| 亚洲国产精品一区二区久久| 免费国产在线观看老王影院| 最近最新高清免费中文字幕| 色窝窝亚洲AV网在线观看| 亚洲视频在线观看网站| 中文字幕第13亚洲另类| 国产啪精品视频网免费| 久久国产乱子伦精品免费一| 国产成人人综合亚洲欧美丁香花 | 亚洲?v女人的天堂在线观看 | 久久精品夜色噜噜亚洲A∨| 国产又黄又爽又猛免费app| 三级毛片在线免费观看| 亚洲中文字幕久久无码| 精品日韩亚洲AV无码| 亚洲中文字幕无码一久久区| 国产成人免费片在线观看| 国产精彩免费视频| 久操视频免费观看| CAOPORN国产精品免费视频| 国产亚洲美女精品久久| 亚洲中文字幕无码av永久| 亚洲制服丝袜精品久久| 亚洲最大福利视频网站| 亚洲乳大丰满中文字幕| 亚洲成年看片在线观看|