@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文章来源:https://www.toymoban.com/news/detail-415914.html
二、解决方案
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
或者如下
文章来源地址https://www.toymoban.com/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 {
/**
* 设置静态资源路径的映射
*/
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/");
}
}
到了这里,关于@EnableWebMvc注解让swagger-ui.html无法打开404报错问题及其解决方案(史上最全最详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!