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.classIt 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.jarAction: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";@Beanpublic 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 {@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();// 设置 securityManagershiroFilterFactoryBean.setSecurityManager(securityManager);// 在 Shiro过滤器链上加入 JWTFilterLinkedHashMap<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;}@Beanpublic SecurityManager securityManager() {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();// 配置 SecurityManager,并注入 shiroRealmsecurityManager.setRealm(shiroRealm());return securityManager;}@Beanpublic ShiroRealm shiroRealm() {// 配置 Realmreturn new ShiroRealm();}@Beanpublic 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
public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer {@Overridepublic 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);}
}
至此,启动项目后可以正常访问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-swagger2Swagger-3:配置扫描接口及开关_哔哩哔哩_bilibili
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