@EnableWebMvc注解讓swagger-ui.html無(wú)法打開404報(bào)錯(cuò)問(wèn)題及其解決方案(史上最全最詳細(xì))
一、出問(wèn)題的經(jīng)過(guò)及其原因
在工作中,通過(guò)Swagger2對(duì)項(xiàng)目的controller進(jìn)行配置,以便于用戶測(cè)試restful服務(wù)接口提高開發(fā)效率。
但是今天卻出現(xiàn)了一個(gè)讓我匪夷所思的問(wèn)題就是在配置類里面加上@EnableWebMvc注解后(開啟web配置支持)啟動(dòng)項(xiàng)目
發(fā)現(xiàn)訪問(wèn)Swagger的ui界面404
這個(gè)我就奇怪了,然后我嘗試的把@EnableWebMvc注解放到啟動(dòng)類上
發(fā)現(xiàn)Swagger-ui.html還是不能訪問(wèn)到報(bào)404錯(cuò)誤,我記得@SpringBootApplication是默認(rèn)開啟自動(dòng)配置webMvc的呀,那為什么會(huì)這樣子呢,
通過(guò)查找資料發(fā)現(xiàn)@EnableWebMvc這個(gè)注解不建議直接配置到@Configuration上
@EnableWebMvc注解會(huì)全面接管SpringMVC,所有的SpringMVC的自動(dòng)配置都失效了,通常不這么干。
查看@EnableWebMvc源碼發(fā)現(xiàn),是繼承的WebMvcConfigurationSupport
然后我去查了SpringBoot對(duì)MVC的自動(dòng)配置WebMvcAutoConfiguration發(fā)現(xiàn)
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
發(fā)現(xiàn)@EnableWebMvc加入之后會(huì)會(huì)取消SpringBoot的自動(dòng)配置,自會(huì)提供最基礎(chǔ)的功能
這就是spring-boot的奧秘,不知不覺中犯錯(cuò),你以為是這樣的,其實(shí)你根本就不了解源碼(原理)!
@EnableWebMvc開啟后,意味著springmvc環(huán)境被你完全接管了(若不定義需要那些bean,確實(shí)啥都沒(méi)有)。而WebMvcAutoConfiguration原本是自動(dòng)裝配的(注入一系列mvc的bean),影響它失效最重要的原因在于:@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) ,是的,正是Condition發(fā)揮了的作用(Ioc容器中已經(jīng)有了WebMvcConfigurationSupport,那WebMvcAutoConfiguration就不會(huì)再實(shí)例化注入)。
而WebMvcAutoConfiguration 原本是通過(guò)spring-boot-autoconfigure-2.0.5.RELEASE.jar/META-INF/spring.factories自動(dòng)裝配的。
總結(jié):
后來(lái)才發(fā)現(xiàn)是@EnableWebMvc注解的問(wèn)題,加了這個(gè)注解以后會(huì)導(dǎo)致靜態(tài)資源路徑無(wú)法訪問(wèn)。
所以根據(jù)總結(jié)不難發(fā)現(xiàn),springboot對(duì)MVC的自動(dòng)配置已經(jīng)幫助我們配置了應(yīng)用開發(fā)中大部分的功能,我們幾乎不用去關(guān)閉修改,當(dāng)然對(duì)Swagger的配置SpringBoot也幫助我們自動(dòng)配置完成。
所以當(dāng)我們?nèi)∠鸖pringBoot自動(dòng)配置的時(shí)候加上了@EnableWebMvc之后,就需要自己配置Swagger文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-415914.html
二、解決方案
2.1 @EnableWebMvc注解必須去掉。
2.2 自定義配置類,實(shí)現(xiàn)WebMvcConfigurer接口,并添加如下代碼
void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/swagger-ui.html");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
}
public
或者如下文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-415914.html
package com.bjsxt.swagger.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
public class MyWebMvcConfigurer2 implements WebMvcConfigurer {
/**
* 設(shè)置靜態(tài)資源路徑的映射
*/
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 解決靜態(tài)資源無(wú)法訪問(wèn)
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
// 解決swagger無(wú)法訪問(wèn)
registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
// 解決swagger的js文件無(wú)法訪問(wèn)
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
到了這里,關(guān)于@EnableWebMvc注解讓swagger-ui.html無(wú)法打開404報(bào)錯(cuò)問(wèn)題及其解決方案(史上最全最詳細(xì))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!