在spring boot中配置多個(gè)DispatcherServlet

spring boot為我們自動(dòng)配置了一個(gè)開箱即用的DispatcherServlet,映射路徑為‘/’章咧,但是如果項(xiàng)目中有多個(gè)服務(wù)怕磨,為了對(duì)不同服務(wù)進(jìn)行不同的配置管理,需要對(duì)不同服務(wù)設(shè)置不同的上下文亲轨,比如開啟一個(gè)DispatcherServlet專門用于rest服務(wù)。

傳統(tǒng)springMVC項(xiàng)目

在傳統(tǒng)的springMVC項(xiàng)目中鸟顺,配置多個(gè)DispatcherServlet很輕松瓶埋,在web.xml中直接配置多個(gè)就行:

    <servlet>
        <servlet-name>restServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/spring2.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>ModelRestServlet</servlet-name>
        <url-pattern>/service/*</url-pattern>
    </servlet-mapping>

通過指定init-param中的contextConfigLocation就能夠?yàn)檫@個(gè)DispatcherServlet指定上下文。

spring boot中注冊(cè)Servlet的兩種方式

但spring boot把tomcat都給隱藏了诊沪,更別說web.xml了养筒。好在提供了另外的方式配置servlet。
1.@WebServlet注解:
這個(gè)是javaee的注解端姚,是servlet3.0以后提供的晕粪。spring boot會(huì)掃描這個(gè)注解,并將這個(gè)注解注解的類注冊(cè)到web容器中作為一個(gè)servlet渐裸。
但是DispatcherServlet并不是自定義的servlet巫湘,而是框架提供的servlet,所以此方法不行昏鹃。
2.ServletRegistrationBean:
這個(gè)bean是由spring boot提供專門來注冊(cè)servlet的尚氛,可以象注冊(cè)bean一樣去配置servlet。

    @Bean
    public ServletRegistrationBean restServlet(){
        //注解掃描上下文
        AnnotationConfigWebApplicationContext applicationContext
                = new AnnotationConfigWebApplicationContext();
        //base package
        applicationContext.scan("com.jerryl.rest");
        //通過構(gòu)造函數(shù)指定dispatcherServlet的上下文
        DispatcherServlet rest_dispatcherServlet
                = new DispatcherServlet(applicationContext);

        //用ServletRegistrationBean包裝servlet
        ServletRegistrationBean registrationBean
                = new ServletRegistrationBean(rest_dispatcherServlet);
        registrationBean.setLoadOnStartup(1);
        //指定urlmapping
        registrationBean.addUrlMappings("/rest/*");
        //指定name洞渤,如果不指定默認(rèn)為dispatcherServlet
        registrationBean.setName("rest");
        return registrationBean;
    }

其中需要注意的是registration.setName("rest")阅嘶,這個(gè)語句很重要,因?yàn)閚ame相同的ServletRegistrationBean只有一個(gè)會(huì)生效载迄,也就是說讯柔,后注冊(cè)的會(huì)覆蓋掉name相同的ServletRegistrationBean。
如果不指定护昧,默認(rèn)為“dispatcherServlet”而spring boot提供的DispatcherServlet的name就是“dispatcherServlet”魂迄。可以在spring boot的DispatcherServletAutoConfiguration類中找到:

        public ServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet) {
            ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet, new String[]{this.serverProperties.getServletMapping()});
            registration.setName("dispatcherServlet");
            registration.setLoadOnStartup(this.webMvcProperties.getServlet().getLoadOnStartup());
            if(this.multipartConfig != null) {
                registration.setMultipartConfig(this.multipartConfig);
            }

            return registration;
        }
    }

所以為了不覆蓋默認(rèn)的dispatcherServlet惋耙,必須指定一個(gè)別的名稱捣炬。

同時(shí)熊昌,在自定義的DispathcerServlet綁定的配置類上,要配置報(bào)掃描的話湿酸,必須要加上@EnableWebMvc注解婿屹,不然不會(huì)掃描@Contrller注解。

package com.jerryl.rest;

@Configuration
@ComponentScan("org.activiti.rest.service.api")
@EnableWebMvc
public class Cfg_Rest {
···
}

屏蔽rest服務(wù)DispatcherServlet對(duì)靜態(tài)資源的訪問

最后還有一個(gè)小問題稿械,因?yàn)橄胱岊~外配置的一個(gè)DispatcherServlet專門用于提供rest服務(wù),但是這樣配置之后冲粤,訪問localhost/rest/時(shí)會(huì)訪問到頁面等靜態(tài)資源美莫,感覺怪怪的。
因?yàn)閟pring boot默認(rèn)是對(duì)靜態(tài)資源做了映射的梯捕,但如果不想要訪問到任何靜態(tài)的資源厢呵,可以修改這個(gè)映射。
兩種方式:
1.在application.yml中配置:

spring:
  mvc:
    #默認(rèn)為/**
    static-path-pattern: /**
  resources:
    #默認(rèn)為classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/ 傀顾。配置多個(gè)路徑襟铭,中間用逗號(hào)隔開。
    static-locations:  

如果在這里配置短曾,就會(huì)影響整個(gè)springboot項(xiàng)目寒砖。但默認(rèn)的DispatcherServlet是需要訪問靜態(tài)資源的,所以不能在這里配置嫉拐。
2.繼承WebMvcConfigurerAdapter的java類中配置:

@Configuration
@EnableWebMvc
public class Cfg_View extends WebMvcConfigurerAdapter{
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**");
    }
}

重寫addResourceHandlers方法哩都,只指定resourceHandler,不指定resourceLocation婉徘,這樣寫就能夠使其攔截掉所有對(duì)靜態(tài)資源的訪問漠嵌,并且不會(huì)返回任何靜態(tài)資源。這里的配置是可指定的盖呼,只需要讓負(fù)責(zé)rest服務(wù)的DispatcherServlet的上下文掃描這個(gè)配置類就可以了儒鹿。不會(huì)影響默認(rèn)的DispatcherServlet。

參考: http://stackoverflow.com/questions/30670327/spring-boot-with-multiple-dispatcherservlet-each-having-their-own-controllers

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末几晤,一起剝皮案震驚了整個(gè)濱河市约炎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蟹瘾,老刑警劉巖章钾,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異热芹,居然都是意外死亡贱傀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門伊脓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來府寒,“玉大人魁衙,你說我怎么就攤上這事≈晟Γ” “怎么了剖淀?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)纤房。 經(jīng)常有香客問我纵隔,道長(zhǎng),這世上最難降的妖魔是什么炮姨? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任捌刮,我火速辦了婚禮,結(jié)果婚禮上舒岸,老公的妹妹穿的比我還像新娘绅作。我一直安慰自己,他們只是感情好蛾派,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布俄认。 她就那樣靜靜地躺著,像睡著了一般洪乍。 火紅的嫁衣襯著肌膚如雪眯杏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天壳澳,我揣著相機(jī)與錄音役拴,去河邊找鬼。 笑死钾埂,一個(gè)胖子當(dāng)著我的面吹牛河闰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播褥紫,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼姜性,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了髓考?” 一聲冷哼從身側(cè)響起部念,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎氨菇,沒想到半個(gè)月后儡炼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡查蓉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年乌询,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片豌研。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡妹田,死狀恐怖唬党,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鬼佣,我是刑警寧澤驶拱,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站晶衷,受9級(jí)特大地震影響蓝纲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晌纫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一税迷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缸匪,春花似錦翁狐、人聲如沸类溢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闯冷。三九已至砂心,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蛇耀,已是汗流浹背辩诞。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纺涤,地道東北人译暂。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像撩炊,于是被迫代替她去往敵國(guó)和親外永。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容