springboot 2.1.0.RELEASE 项目加入swagger接口文档

news2024/11/25 14:39:07

Release v2.1.0.RELEASE · spring-projects/spring-boot · GitHub

springboot 2.1.0.RELEASE发行日期是2018年10月30日(Oct 30, 2018)

不要使用过高的swagger版本,如SpringFox Boot Starter » 3.0.0,否则报错:

spring-plugin-core-1.2.0.RELEASE.jar不兼容
2023-11-15 11:50:24.544 febs [main] ERROR o.s.b.d.LoggingFailureAnalysisReporter - 

***************************
APPLICATION FAILED TO START
***************************

Description:

An attempt was made to call the method org.springframework.plugin.core.PluginRegistry.getPluginFor(Ljava/lang/Object;)Ljava/util/Optional; but it does not exist. Its class, org.springframework.plugin.core.PluginRegistry, is available from the following locations:

    jar:file:/D:/env/maven/repo395/org/springframework/plugin/spring-plugin-core/1.2.0.RELEASE/spring-plugin-core-1.2.0.RELEASE.jar!/org/springframework/plugin/core/PluginRegistry.class

It was loaded from the following location:

    file:/D:/env/maven/repo395/org/springframework/plugin/spring-plugin-core/1.2.0.RELEASE/spring-plugin-core-1.2.0.RELEASE.jar


Action:

Correct the classpath of your application so that it contains a single, compatible version of org.springframework.plugin.core.PluginRegistry

这个错误涉及版本依赖兼容性,研究明白所需时间成本不划算。

改用同时期的swagger版本即可。

 具体配置方法:

1、在pom.xml中加入依赖

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

 2、在代码中加入配置类:

package cc.mrbird.febs.common.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration  
@EnableSwagger2
public class Swagger2Configuration {
   //api接口包扫描路径
   public static final String SWAGGER_SCAN_BASE_PACKAGE = "cc.mrbird.febs";
   public static final String VERSION = "1.0.0";
   @Bean
   public Docket createRestApi() {
       return new Docket(DocumentationType.SWAGGER_2)
                   .apiInfo(apiInfo())
                   .select()
                   .apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE))
                   .paths(PathSelectors.any()) // 可以根据url路径设置哪些请求加入文档,忽略哪些请求
                   .build();
   }
   private ApiInfo apiInfo() {
       return new ApiInfoBuilder()
                   .title("食堂库房管理系统API") //设置文档的标题
                   .description("系统后台接口swagger说明文档") // 设置文档的描述
                   .version(VERSION) // 设置文档的版本信息-> 1.0.0 Version information
                   .termsOfServiceUrl("www.jlrc.com") // 设置文档的License信息->1.3 License information
                   .build();
   }
}

类的注释不可缺失:

@Configuration  
@EnableSwagger2

所填内容与界面上的标题信息显示是一一对应的

 实际上就是向spring物流中心存入了Docket类型的Bean对象备用(向spring容器存入了Docket类型的Bean)

3、由于项目使用了shiro做鉴权访问控制,需要开放swagger访问路径

Shiro 放行Swagger_shiro 放行 swagger-CSDN博客

// 放行Swagger相关访问
filterChainDefinitionMap.put("/docs", "anon");
filterChainDefinitionMap.put("/swagger-ui.html", "anon");
filterChainDefinitionMap.put("/webjars/springfox-swagger-ui/**", "anon");
filterChainDefinitionMap.put("/swagger-resources/**", "anon");
filterChainDefinitionMap.put("/v2/api-docs", "anon");
package cc.mrbird.febs.common.authentication;

import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import java.util.LinkedHashMap;

/**
 * Shiro 配置类
 *
 * @author MrBird
 */
@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        // 设置 securityManager
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        // 在 Shiro过滤器链上加入 JWTFilter
        LinkedHashMap<String, Filter> filters = new LinkedHashMap<>();
        filters.put("jwt", new JWTFilter());
        shiroFilterFactoryBean.setFilters(filters);

        LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();

        // swagger接口文档
        // 放行Swagger相关访问
        filterChainDefinitionMap.put("/docs", "anon");
        filterChainDefinitionMap.put("/swagger-ui.html", "anon");
        filterChainDefinitionMap.put("/webjars/springfox-swagger-ui/**", "anon");
        filterChainDefinitionMap.put("/swagger-resources/**", "anon");
        filterChainDefinitionMap.put("/v2/api-docs", "anon");

        // 所有请求都要经过 jwt过滤器
        filterChainDefinitionMap.put("/**", "jwt");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        // 配置 SecurityManager,并注入 shiroRealm
        securityManager.setRealm(shiroRealm());
        return securityManager;
    }

    @Bean
    public ShiroRealm shiroRealm() {
        // 配置 Realm
        return new ShiroRealm();
    }

    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }
}

4、swagger-ui.html 404问题

访问

http://localhost:9527/swagger-ui.html

提示404找不到页面

 原因是自定义的webmvc配置类的addResourceHandlers方法(@override父类接口的WebMvcConfigurer#addResourceHandlers)未将io.springfox:springfox-swagger-ui:2.9.2包中的resource资源引入spring项目中,需要手动配置

 

cc.mrbird.febs.common.config.MyWebMvcConfigurerAdapter#addResourceHandlers

package cc.mrbird.febs.common.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
//@EnableWebMvc 不要加@EnableWebMvc,加了会启用Spring MVC框架的默认配置,导致获取RequestContextHolder.getRequestAttributes()为空
public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
       
      //registry.addResourceHandler("/imagesWeb/**").addResourceLocations("file:E:/Project/食堂采购系统/db/");// 这个路径有疑问,不能直接操作E盘
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }
}

https://www.cnblogs.com/birdy-silhouette/p/16400888.html

RequestContextHolder.getRequestAttributes()空指针-CSDN博客

@EnableWebMvc注解的作用和示例 – 编程技术之美-IT之美

至此,启动项目后可以正常访问swagger页面。

参考:

https://www.cnblogs.com/xiaoqi/p/swagger-ui-404.html

https://www.cnblogs.com/pangguoming/p/10551895.html

 https://mvnrepository.com/artifact/io.springfox/springfox-swagger2

Swagger-3:配置扫描接口及开关_哔哩哔哩_bilibili

https://www.cnblogs.com/progor/p/13297904.html

PS:swagger有个官网:

API Documentation & Design Tools for Teams | Swagger

虽然也能找到swagger ui的介绍,但是内容完全与springboot集成无关

REST API Documentation Tool | Swagger UI

实际上springboot集成的swagger是github上一个叫springfox的项目:

GitHub - springfox/springfox: Automated JSON API documentation for API's built with Spring

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1219708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java学习之路 —— 多线程

文章目录 1. 线程创建方式1.1 继承Thread1.2 声明一个实现Runnable接口的类1.3 利用Callable接口、FutureTask类来实现 2. 线程同步2.1 同步代码块2.2 同步方法2.3 Lock锁 3. 线程同步4. 线程池 1. 线程创建方式 1.1 继承Thread 定义子类&#xff0c;继承Thread&#xff0c;创…

Vue指令修饰符、v-bind、v-model、computed计算属性、watch侦听器

前言 持续学习总结输出中&#xff0c;Vue指令修饰符、v-bind、v-model、computed计算属性、watch侦听器 一、指令修饰符 1.什么是指令修饰符&#xff1f; 所谓指令修饰符就是通过“.”指明一些指令后缀 &#xff0c;不同的后缀封装了不同的处理操作 —> 简化代码 2.按键…

玩具、儿童用品、儿童服装上亚马逊TEMU平台CPC认证办理

CPC认证是Childrens Product Certificate的简称&#xff0c;即儿童产品证书。它是美国强制性法规CPSIA要求的一部分&#xff0c;该法规主要针对12岁及以下儿童使用的产品&#xff0c;如玩具、儿童用品、儿童服装等。 一、儿童小汽车CPC测试项目可能会因产品标准和法规的不同而…

开关电源测试之输出暂态响应测试标准及方法详解

暂态响应是指在接收到输入信号后&#xff0c;输出信号在短时间内产生的变化。开关电源输出暂态响应测试是为了检测输出负载快速变化时&#xff0c;输出电压跟随变动的稳定性。 开关电源输出暂态响应怎么测试&#xff1f; 测试目的&#xff1a;测试S.M.P.S.输出负载快速变化时&a…

中小型企业内网搭建

某中小型公司客户提出网络比较单一整体都在一个大的广播域中&#xff0c;AP无线的SSID有很多个&#xff0c;包括一些小的无线路由器散发出来的信号&#xff0c;用起来网络不太稳定&#xff0c;并且AP的SSID要分开&#xff0c;办公室只有单个SSID&#xff0c;不允许出现其他的&a…

【Ubuntu】设置永不息屏与安装 dconf-editor

方式一、GUI界面进行设置 No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal打开 Ubuntu 桌面环境的设置菜单。你可以通过点击屏幕右上角的系统菜单&#xff0c;然后选择设置。在设置菜单中&#xff0c;…

休闲机动滑板车和便携式自行车ASTMF2641-23测试标准如何办理?

领先的行业资讯 近日&#xff0c;美国材料实验协会ASTM发布了2023版“休闲机动滑板车和便携式自行车的消费者安全规范” ASTM F2641-23&#xff0c;取代上一版本ASTM F2641-08 (2015)。 该规范是基于目前最先进的娱乐电动滑板车和迷你摩托车技术水平&#xff0c;旨在涵盖产品的…

Win10专业版如何重装-Win10专业版重装系统教程

Win10专业版如何重装&#xff1f;Win10专业版系统能够用户带来丰富的功能服务&#xff0c;用户操作需求轻松得到满足。如果我们在Win10专业版电脑中&#xff0c;遇到了系统问题&#xff0c;这时候可以考虑重新安装Win10专业版系统&#xff0c;从而解决系统出现的问题。下面小编…

全球温度数据下载

1.全球年平均温度下载https://www.ncei.noaa.gov/data/global-summary-of-the-year/archive/ 2.全球月平均气温下载https://www.ncei.noaa.gov/data/global-summary-of-the-month/archive/ 3.全球日平均气温下载https://www.ncei.noaa.gov/data/global-summary-of-the-day/ar…

Bard似乎在胡扯的路上飞速狂奔?

Bard似乎在胡扯的路上飞速狂奔&#xff1f;连最简单的问题都以胡扯来回答&#xff1f;

全网火爆,接口自动化测试框架-fixture函数使用,一篇打通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 setup和teardown能…

医疗项目的需求分析以及开发流程

一.项目的背景以及需求 1.项目背景 1.政策层面来看&#xff0c;近年来我国政府相关部门陆续颁发了支持数字医疗行业发展的相关政策&#xff0c;“互联网医疗”政策逐渐明确完善&#xff0c;为数字医疗行业发展提供支持&#xff0c;行业迎来政策福利期。 其次&#xff0c;从经济…

echarts 数据过多时展示滚动条

【echarts官网地址&#xff1a;Documentation - Apache ECharts】 针对echarts图数据过多的情况&#xff0c;echarts官网有专门的属性dataZoom&#xff1a;用于区域缩放&#xff0c;从而能自由关注细节的数据信息&#xff0c;或者概览数据整体&#xff0c;或者去除离群点的影响…

超全整理,Pytest自动化测试框架-多进程(pytest-xdist)运行总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 平常我们功能测试…

在誉天学习华为认证,有真机吗

通过培训机构学习华为认证&#xff0c;特别是在HCIE的课程学习中&#xff0c;很多人关心的就是培训机构是否有真机能够进行华为认证的相关实验&#xff0c;今天我们一起来看看&#xff0c;在誉天学习华为认证&#xff0c;有真机吗&#xff1f; 誉天总部数据中心机房和誉天总部一…

获取微信小程序二维码

可直接通过微信扫描小程序二维码直接进入小程序&#xff0c;可用在分享推广业务。 目录 Curl请求方法 获取小程序token 获取小程序二维码 参数说明 注意 请求结果 Curl请求方法 需要请求微信小程序的API接口&#xff0c;封装好curl请求方法。 代码如下&#xff1a; /*…

西浦成立产业家学院破解 “产业级” 问题!AMT企源成首批合作机构

在推动高质量发展的国家战略背景下&#xff0c;从集成电路到人工智能&#xff0c;从新能源到绿色低碳&#xff0c;从健康养老到数字文创&#xff0c;无论国家还是区域都面临着产业转型升级或突破创新的发展需求&#xff0c; 这些 “产业级” 问题的难度远非单个企业层面问题可比…

C++泛型编程——模板(初识)

C泛型编程——模板&#xff08;初识&#xff09; 文章目录 C泛型编程——模板&#xff08;初识&#xff09;1. 泛型编程的概念2. 模板2.1 模板格式2.2 函数模板2.3 函数模板的实例化2.3.1 隐式&#xff08;推演&#xff09;实例化2.3.2 显式实例化 2.3 类模板3. 模板的本质 本章…

【教学类-36】八等分格子-A4竖版-4条(制作皇冠、戒指)

背景需求&#xff1a; 最近在大四班孩子中间普及铅画纸制作“方盒”的活动&#xff0c;目前进展到使用三条8等分的长条纸&#xff0c;制作一个“坚硬的、不漏底”的方盒。 实验后&#xff0c;我想试试如果缩小纸条长宽&#xff0c;是不是可以做“迷你”纸盒。 目的&#xff…

为什么别人年薪30W+?同样为测试人,“我“的测试之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、软件测试员&am…