@EnableWebMvc注解让swagger-ui.html无法打开404报错问题及其解决方案(史上最全最详细)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
@EnableWebMvc注解让swagger-ui.html无法打开404报错问题及其解决方案史上最全最详细
目录
一、出问题的经过及其原因
在工作中通过Swagger2对项目的controller进行配置以便于用户测试restful服务接口提高开发效率。
但是今天却出现了一个让我匪夷所思的问题就是在配置类里面加上@EnableWebMvc注解后开启web配置支持启动项目
发现访问Swagger的ui界面404
这个我就奇怪了然后我尝试的把@EnableWebMvc注解放到启动类上
发现Swagger-ui.html还是不能访问到报404错误我记得@SpringBootApplication是默认开启自动配置webMvc的呀那为什么会这样子呢
通过查找资料发现@EnableWebMvc这个注解不建议直接配置到@Configuration上
@EnableWebMvc注解会全面接管SpringMVC所有的SpringMVC的自动配置都失效了通常不这么干。
查看@EnableWebMvc源码发现是继承的WebMvcConfigurationSupport
然后我去查了SpringBoot对MVC的自动配置WebMvcAutoConfiguration发现
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
发现@EnableWebMvc加入之后会会取消SpringBoot的自动配置自会提供最基础的功能
这就是spring-boot的奥秘不知不觉中犯错你以为是这样的其实你根本就不了解源码原理
@EnableWebMvc开启后意味着springmvc环境被你完全接管了若不定义需要那些bean确实啥都没有。而WebMvcAutoConfiguration原本是自动装配的注入一系列mvc的bean影响它失效最重要的原因在于@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) 是的正是Condition发挥了的作用Ioc容器中已经有了WebMvcConfigurationSupport那WebMvcAutoConfiguration就不会再实例化注入。
而WebMvcAutoConfiguration 原本是通过spring-boot-autoconfigure-2.0.5.RELEASE.jar/META-INF/spring.factories自动装配的。
总结
后来才发现是@EnableWebMvc注解的问题加了这个注解以后会导致静态资源路径无法访问。
所以根据总结不难发现springboot对MVC的自动配置已经帮助我们配置了应用开发中大部分的功能我们几乎不用去关闭修改当然对Swagger的配置SpringBoot也帮助我们自动配置完成。
所以当我们取消SpringBoot自动配置的时候加上了@EnableWebMvc之后就需要自己配置Swagger
二、解决方案
2.1 @EnableWebMvc注解必须去掉。
2.2 自定义配置类实现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
或者如下
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 {
/**
* 设置静态资源路径的映射
*/
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 解决静态资源无法访问
registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
// 解决swagger无法访问
registry.addResourceHandler("/swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
// 解决swagger的js文件无法访问
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}