SpringBoot+Cloud+oauth2.0+JWT集成swagger及swagger-bootstrap-ui详细步骤
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详细步骤相关推荐
- SpringSecurity+OAuth2.0+JWT实现单点登录应用
SpringSecurity+OAuth2.0+JWT实现单点登录应用 gitee项目练习地址:https://gitee.com/xzq25_com/springsecurity.oauth2 OA ...
- oauth2.0+jwt资源服务器配置
oauth2.0+jwt资源服务的配置 配置ResourceConfig 测试 密码授权方式 授权码方式 配置ResourceConfig package com.fxj.resource.confi ...
- springboot集成swagger2多模块中文配置详细步骤,解决集成mybatis或mybatis-plus无法正常使用问题
springboot集成swagger2多模块中文配置详细步骤,解决集成mybatis或mybatis-plus无法正常使用问题 参考文章: (1)springboot集成swagger2多模块中文配 ...
- SpringBoot中oauth2.0学习之服务端配置快速上手
现在第三方登录的例子数见不鲜.其实在这种示例当中,oauth2.0是使用比较多的一种授权登录的标准.oauth2.0也是从oauth1.0升级过来的.那么关于oauth2.0相关的概念及其原理,大家可 ...
- spring security oauth2.0 client集成第三方登录
大家上网的时候可能会遇见这样的一个问题,就是我们去访问一个网站,但是又不想去注册这个网站的账号,账号太多了实在是记不来,于是我们可以用qq或者微信登录这个网站,简直不要太方便有没有. 这么 ...
- Salesforce Integration - OAuth2.0 JWT Bearer Flow
应用场景 Salesforce作为Service Provider (SP),外部系统需要访问Salesforce数据: 在授权过程中无需通过UI Login页面输入账密: 不希望外部系统储存账密等可 ...
- Spring Security + OAuth2.0
授权服务器 授权服务器中有4个端点.说明如下: Authorize Endpoint :授权端点,进行授权. Token Endpoint :令牌端点,经过授权拿到对应的Token. lntrospe ...
- SpringSecurity整合OAuth2.0
SpringSecurity整合OAuth2 一.概述与原理 1.1 .OAuth2.0 是什么? 1.2.OAuth2.0中角色解释 1.3.OAuth2.0的4中授权模式 1.3.1.授权码模式( ...
- php对接AliGenie天猫精灵服务器控制智能硬件esp8266② 全面认识第三方授权机制 oauth2.0 协议,如何在 php 上搭建 oauth2.0服务端!(附带demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. php对接AliGenie天猫精灵服务器控制智能硬件esp82 ...
最新文章
- PingCode 全年上线功能盘点
- 文件操作:在某手诗文中插入一句话
- Virtual ListView效率对比
- [JavaWeb-JDBC]JDBC概念
- 飞畅科技-工业以太网的应用现状及前景展望
- Matlab--获取300dpi或600dpi图形插入word2010中
- python里textfield_Django:为什么我的CharField没有得到类vTextField?
- 7.js模式-装饰者模式
- 计算机共享文件误删怎么恢复,电脑数据恢复分享:电脑文件删除了怎么恢复
- python入门到精通 _6文件读写
- 【源码分享】一键打开禅意生活——电子木鱼微信小程序源码分享
- 程序员年龄增大后的职业出路是什么?
- 世上本没有对错,看问题的角度不同,答案不同而已,我们应该学会常常用别人的角度看世界,多一分宽容,多一分理解,多一分求同存异。
- AI“头雁”百度的进取之道:善弈者通盘无妙手
- HDU - 3681 Prison Break(状态压缩 + 最短路)
- Ubuntu部署OpenStack zed版本neutron报错:Feature ‘linuxbridge‘ is experimental and has to be explicitly enab
- 【经验分享】研一ICer如何拿到海思数字IC实习offer
- 2008 R2修复光盘_华录企业级蓝光光盘库DA-BH9010太原售
- 系统提示“该内存不能为read”的原因及解决方法
- php 计算xirr