SpringBoot+Cloud集成swagger及swagger-bootstrap-ui详细步骤如下:

  • 实现效果图
  • 引入Maven依赖
  • swagger的配置文件属性
    • 配置文件所需要的类
    • oauth的拦截机制配置
    • 应用启动类
  • 注意事项
  • bug问题解决
    • 问题1: java.lang.NumberFormatException: For input string: ""

实现效果图

先看是否效果图是否符合你的预期符合预期你在接着往下看

引入Maven依赖

 <!-- swagger文档API 关于swagger-ui.html的依赖我去掉了-->//这个是优化界面的类似插件会让doc.html变得更好看<dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>2.0.4</version></dependency>//swagger2的依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency>//swagger-ui的界面 这个访问doc.html<dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version></dependency>

swagger的配置文件属性

import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.Contact;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
/*** @author hanfeng* @date 2021/8/24*/
@Configuration
@EnableSwagger2
@EnableAutoConfiguration
@ConditionalOnProperty(name = "swagger.enabled", matchIfMissing = true)
@EnableSwaggerBootstrapUI
public class SwaggerAutoConfiguration
{/*** 默认的排除路径,排除Spring Boot默认的错误处理路径和端点*/private static final List<String> DEFAULT_EXCLUDE_PATH = Arrays.asList("/error", "/actuator/**");private static final String BASE_PATH = "/**";@Bean@ConditionalOnMissingBeanpublic SwaggerProperties swaggerProperties(){return new SwaggerProperties();}@Beanpublic Docket api(SwaggerProperties swaggerProperties){// base-path处理if (swaggerProperties.getBasePath().isEmpty()){swaggerProperties.getBasePath().add(BASE_PATH);}// noinspection uncheckedList<Predicate<String>> basePath = new ArrayList<Predicate<String>>();swaggerProperties.getBasePath().forEach(path -> basePath.add(PathSelectors.ant(path)));// exclude-path处理if (swaggerProperties.getExcludePath().isEmpty()){swaggerProperties.getExcludePath().addAll(DEFAULT_EXCLUDE_PATH);}List<Predicate<String>> excludePath = new ArrayList<>();swaggerProperties.getExcludePath().forEach(path -> excludePath.add(PathSelectors.ant(path)));//noinspection Guavareturn new Docket(DocumentationType.SWAGGER_2).host(swaggerProperties.getHost()).apiInfo(apiInfo(swaggerProperties)).select().apis(RequestHandlerSelectors.basePackage(swaggerProperties.getBasePackage())).paths(Predicates.and(Predicates.not(Predicates.or(excludePath)), Predicates.or(basePath))).build().securitySchemes(securitySchemes()).securityContexts(securityContexts()).pathMapping("/");}/*** 安全模式,这里指定token通过Authorization头请求头传递*/private List<ApiKey> securitySchemes(){List<ApiKey> apiKeyList = new ArrayList<ApiKey>();apiKeyList.add(new ApiKey("Authorization", "Authorization", "header"));return apiKeyList;}/*** 安全上下文*/private List<SecurityContext> securityContexts(){List<SecurityContext> securityContexts = new ArrayList<>();securityContexts.add(SecurityContext.builder().securityReferences(defaultAuth()).forPaths(PathSelectors.regex("^(?!auth).*$")).build());return securityContexts;}/*** 默认的全局鉴权策略** @return*/private List<SecurityReference> defaultAuth(){AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];authorizationScopes[0] = authorizationScope;List<SecurityReference> securityReferences = new ArrayList<>();securityReferences.add(new SecurityReference("Authorization", authorizationScopes));return securityReferences;}private ApiInfo apiInfo(SwaggerProperties swaggerProperties){return new ApiInfoBuilder().title("swagger构建项目api文档").description("https://www.baidu.com/").license(swaggerProperties.getLicense()).licenseUrl(swaggerProperties.getLicenseUrl()).termsOfServiceUrl("https://www.baidu.com/").contact(new Contact(swaggerProperties.getContact().getName(), swaggerProperties.getContact().getUrl(), swaggerProperties.getContact().getEmail())).version("1.0").build();}
}

配置文件所需要的类


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.List;/*** @author hanfeng* @date 2021/8/24*/
@Data
@Component
@ConfigurationProperties("swagger")
public class SwaggerProperties
{/*** 是否开启swagger*/private Boolean enabled;/*** swagger会解析的包路径**/private String basePackage = "";/*** swagger会解析的url规则**/private List<String> basePath = new ArrayList<>();/*** 在basePath基础上需要排除的url规则**/private List<String> excludePath = new ArrayList<>();/*** 标题**/private String title = "";/*** 描述**/private String description = "";/*** 版本**/private String version = "";/*** 许可证**/private String license = "";/*** 许可证URL**/private String licenseUrl = "";/*** 服务条款URL**/private String termsOfServiceUrl = "";/*** host信息**/private String host = "";/*** 联系人信息*/private Contact contact = new Contact();/*** 全局统一鉴权配置**/private Authorization authorization = new Authorization();public static class Contact{/*** 联系人**/private String name = "";/*** 联系人url**/private String url = "";/*** 联系人email**/private String email = "";public String getName(){return name;}public void setName(String name){this.name = name;}public String getUrl(){return url;}public void setUrl(String url){this.url = url;}public String getEmail(){return email;}public void setEmail(String email){this.email = email;}}public static class Authorization{/*** 鉴权策略ID,需要和SecurityReferences ID保持一致*/private String name = "";/*** 需要开启鉴权URL的正则*/private String authRegex = "^.*$";/*** 鉴权作用域列表*/private List<AuthorizationScope> authorizationScopeList = new ArrayList<>();private List<String> tokenUrlList = new ArrayList<>();public String getName(){return name;}public void setName(String name){this.name = name;}public String getAuthRegex(){return authRegex;}public void setAuthRegex(String authRegex){this.authRegex = authRegex;}public List<AuthorizationScope> getAuthorizationScopeList(){return authorizationScopeList;}public void setAuthorizationScopeList(List<AuthorizationScope> authorizationScopeList){this.authorizationScopeList = authorizationScopeList;}public List<String> getTokenUrlList(){return tokenUrlList;}public void setTokenUrlList(List<String> tokenUrlList){this.tokenUrlList = tokenUrlList;}}public static class AuthorizationScope{/*** 作用域名称*/private String scope = "";/*** 作用域描述*/private String description = "";public String getScope(){return scope;}public void setScope(String scope){this.scope = scope;}public String getDescription(){return description;}public void setDescription(String description){this.description = description;}}}

oauth的拦截机制配置

这个如果不配置有时候可能会出现401的现象

//安全拦截机制(最重要)@Overrideprotected void configure(HttpSecurity http) throws Exception {http.csrf().disable().authorizeRequests().antMatchers("/actuator/**","/v2/api-docs", "/swagger-resources/configuration/ui","/swagger-resources","/swagger-resources/configuration/security","/swagger-ui.html","/css/**", "/js/**","/images/**", "/webjars/**","**/favicon.ico", "/index","/doc.html").permitAll()  //健康检查端点 执行放行.anyRequest().authenticated().and().formLogin();}

应用启动类

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import springfox.documentation.swagger2.annotations.EnableSwagger2;/*** @author hanfeng* @date 2021/5/18*/
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan("com.sys.mapper")
@EnableAutoConfiguration
@EnableSwagger2
public class SysApplication   {public static void main(String[] args) {SpringApplication.run(SysApplication.class,args);}
}

注意事项

如果你的代码里继承了WebMvcConfigurationSupport 这个类的话则需要在配置里边添加如下代码:

/*** 发现如果继承了WebMvcConfigurationSupport,则在yml中配置的相关内容会失效。 需要重新指定静态资源** @param registry* */@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");}

如果@EnableSwaggerBootstrapUI找不到的话,那就把pom文件中的swagger-ui的依赖去掉

//这个是初始的依赖,应该是有冲突,如果注解找不到的就去掉这个保留swagger-bootstrap-ui即可
<dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.7.0</version>
</dependency>

bug问题解决

问题1: java.lang.NumberFormatException: For input string: “”

每次启动时报如下错误

 WARN 19699 --- [nio-1111-exec-4] i.s.m.p.AbstractSerializableParameter    : Illegal DefaultValue null for parameter type integerjava.lang.NumberFormatException: For input string: ""at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_171]at java.lang.Long.parseLong(Long.java:601) ~[na:1.8.0_171]at java.lang.Long.valueOf(Long.java:803) ~[na:1.8.0_171]at io.swagger.models.parameters.AbstractSerializableParameter.getExample(AbstractSerializableParameter.java:412) ~[swagger-models-1.5.20.jar:1.5.20]at sun.reflect.GeneratedMethodAccessor109.invoke(Unknown Source) ~[na:na]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:687) [jackson-databind-2.9.6.jar:2.9.6]

解决办法: 排除依赖更新版本即可

<!--swagger依赖--><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> <exclusions> <exclusion> <groupId>io.swagger</groupId> <artifactId>swagger-annotations</artifactId> </exclusion> <exclusion> <groupId>io.swagger</groupId> <artifactId>swagger-models</artifactId></exclusion></exclusions>
</dependency><!--解决进入swagger页面报类型转换错误,排除2.9.2中的引用,手动增加1.5.21版本--><dependency><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId><version>1.5.21</version>
</dependency>
<dependency><groupId>io.swagger</groupId><artifactId>swagger-models</artifactId><version>1.5.21</version>
</dependency>

SpringBoot+Cloud+oauth2.0+JWT集成swagger及swagger-bootstrap-ui详细步骤相关推荐

  1. SpringSecurity+OAuth2.0+JWT实现单点登录应用

    SpringSecurity+OAuth2.0+JWT实现单点登录应用 gitee项目练习地址:https://gitee.com/xzq25_com/springsecurity.oauth2 OA ...

  2. oauth2.0+jwt资源服务器配置

    oauth2.0+jwt资源服务的配置 配置ResourceConfig 测试 密码授权方式 授权码方式 配置ResourceConfig package com.fxj.resource.confi ...

  3. springboot集成swagger2多模块中文配置详细步骤,解决集成mybatis或mybatis-plus无法正常使用问题

    springboot集成swagger2多模块中文配置详细步骤,解决集成mybatis或mybatis-plus无法正常使用问题 参考文章: (1)springboot集成swagger2多模块中文配 ...

  4. SpringBoot中oauth2.0学习之服务端配置快速上手

    现在第三方登录的例子数见不鲜.其实在这种示例当中,oauth2.0是使用比较多的一种授权登录的标准.oauth2.0也是从oauth1.0升级过来的.那么关于oauth2.0相关的概念及其原理,大家可 ...

  5. spring security oauth2.0 client集成第三方登录

       大家上网的时候可能会遇见这样的一个问题,就是我们去访问一个网站,但是又不想去注册这个网站的账号,账号太多了实在是记不来,于是我们可以用qq或者微信登录这个网站,简直不要太方便有没有.    这么 ...

  6. Salesforce Integration - OAuth2.0 JWT Bearer Flow

    应用场景 Salesforce作为Service Provider (SP),外部系统需要访问Salesforce数据: 在授权过程中无需通过UI Login页面输入账密: 不希望外部系统储存账密等可 ...

  7. Spring Security + OAuth2.0

    授权服务器 授权服务器中有4个端点.说明如下: Authorize Endpoint :授权端点,进行授权. Token Endpoint :令牌端点,经过授权拿到对应的Token. lntrospe ...

  8. SpringSecurity整合OAuth2.0

    SpringSecurity整合OAuth2 一.概述与原理 1.1 .OAuth2.0 是什么? 1.2.OAuth2.0中角色解释 1.3.OAuth2.0的4中授权模式 1.3.1.授权码模式( ...

  9. php对接AliGenie天猫精灵服务器控制智能硬件esp8266② 全面认识第三方授权机制 oauth2.0 协议,如何在 php 上搭建 oauth2.0服务端!(附带demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. php对接AliGenie天猫精灵服务器控制智能硬件esp82 ...

最新文章

  1. PingCode 全年上线功能盘点
  2. 文件操作:在某手诗文中插入一句话
  3. Virtual ListView效率对比
  4. [JavaWeb-JDBC]JDBC概念
  5. 飞畅科技-工业以太网的应用现状及前景展望
  6. Matlab--获取300dpi或600dpi图形插入word2010中
  7. python里textfield_Django:为什么我的CharField没有得到类vTextField?
  8. 7.js模式-装饰者模式
  9. 计算机共享文件误删怎么恢复,电脑数据恢复分享:电脑文件删除了怎么恢复
  10. python入门到精通 _6文件读写
  11. 【源码分享】一键打开禅意生活——电子木鱼微信小程序源码分享
  12. 程序员年龄增大后的职业出路是什么?
  13. 世上本没有对错,看问题的角度不同,答案不同而已,我们应该学会常常用别人的角度看世界,多一分宽容,多一分理解,多一分求同存异。
  14. AI“头雁”百度的进取之道:善弈者通盘无妙手
  15. HDU - 3681 Prison Break(状态压缩 + 最短路)
  16. Ubuntu部署OpenStack zed版本neutron报错:Feature ‘linuxbridge‘ is experimental and has to be explicitly enab
  17. 【经验分享】研一ICer如何拿到海思数字IC实习offer
  18. 2008 R2修复光盘_华录企业级蓝光光盘库DA-BH9010太原售
  19. 系统提示“该内存不能为read”的原因及解决方法
  20. php 计算xirr

热门文章

  1. 知名ECM厂商Open Text进军中国市场
  2. eos代币映射 代码实战分析
  3. 防扫描配置与弱口令利用,检测和防御
  4. Efficient Sparse Pose Adjustment(SPA) for 2D Mapping 翻译和总结
  5. 《python 网络爬虫技术》参考答案 第1章~第7章
  6. 练手小项目(2)-生活小助手--星座运势查询
  7. linux pci网卡驱动
  8. 爬虫爬取赶集网租房信息
  9. 从零讲JAVA,给你一条清晰地学习道路,该学什么就学什么
  10. Spek:JetBrains出品的JVM语言规范框架