当前位置: 首页 > news >正文

@EnableWebMvc注解让swagger-ui.html无法打开404报错问题及其解决方案(史上最全最详细)

@EnableWebMvc注解让swagger-ui.html无法打开404报错问题及其解决方案(史上最全最详细)

目录

  • @EnableWebMvc注解让swagger-ui.html无法打开404报错问题及其解决方案(史上最全最详细)
    • 一、出问题的经过及其原因
    • 二、解决方案
      • 2.1 @EnableWebMvc注解必须去掉。
      • 2.2 自定义配置类,实现WebMvcConfigurer接口,并添加如下代码

一、出问题的经过及其原因

在工作中,通过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接口,并添加如下代码


public 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/");
}

在这里插入图片描述
或者如下
在这里插入图片描述

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/");
    }

}

相关文章:

  • Java接口:概述、多实现、多继承、JDK8后接口新增方法
  • 【Java基础】010 -- Java基础综合练习
  • Cesium 和 webgl 加载各类型模型说明
  • 微服务项目(01)
  • 【git】使用技巧
  • Python爬虫(6)-selenium用requests、wget、urllib3这3种方法搞定图片和PDF文件下载
  • 【python学习笔记】:方便好用的自动化脚本
  • 如何使用Python中处理word文档的模块—docx模块
  • 【Python语言基础】——Python 文件处理
  • Go性能调优及相关工具使用(四)——性能调优工具pprof的使用
  • SRE:如何提高报警有效性?
  • C生万物 | 窥探数组设计的种种陷阱
  • git解决代码冲突问题
  • DefTet
  • 单片机阻塞延时与非阻塞延时(1)
  • Kubernetes 入门
  • 深入探讨YOLOv8 网络架构
  • 【NLP】一种基于联合方式的三元组抽取模型——CasRel
  • 接口自动化测试-python-笔记
  • OpenPPL PPQ量化(3):量化计算图的加载和预处理 源码剖析
  • 电加热油锅炉工作原理_电加热导油
  • 大型电蒸汽锅炉_工业电阻炉
  • 燃气蒸汽锅炉的分类_大连生物质蒸汽锅炉
  • 天津市维修锅炉_锅炉汽化处理方法
  • 蒸汽汽锅炉厂家_延安锅炉厂家
  • 山西热水锅炉厂家_酒店热水 锅炉
  • 蒸汽锅炉生产厂家_燃油蒸汽发生器
  • 燃煤锅炉烧热水_张家口 淘汰取缔燃煤锅炉
  • 生物质锅炉_炉
  • 锅炉天然气_天燃气热风炉