ERROR Unable to scan documentation context default
com.google.common.util.concurrent.UncheckedExecutionException: java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class springfox.documentation.spi.service.contexts.SecurityContext (java.util.ArrayList is in module java.base of loader 'bootstrap'; springfox.documentation.spi.service.contexts.SecurityContext is in unnamed module of loader 'app')
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2214)
at com.google.common.cache.LocalCache.get(LocalCache.java:4053)
at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:4057)
at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4986)
at com.google.common.cache.LocalCache$LocalLoadingCache.getUnchecked(LocalCache.java:4992)
at springfox.documentation.spring.web.scanners.CachingOperationReader.read(CachingOperationReader.java:57)
at springfox.documentation.spring.web.scanners.ApiDescriptionReader.read(ApiDescriptionReader.java:70)
at springfox.documentation.spring.web.scanners.ApiListingScanner.scan(ApiListingScanner.java:134)
at springfox.documentation.spring.web.scanners.ApiDocumentationScanner.scan(ApiDocumentationScanner.java:71)
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.scanDocumentation(DocumentationPluginsBootstrapper.java:101)
at springfox.documentation.spring.web.plugins.DocumentationPluginsBootstrapper.start(DocumentationPluginsBootstrapper.java:167)
at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178)
at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:54)
at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:356)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at org.springframework.context.support.DefaultLifecycleProcessor.startBeans(DefaultLifecycleProcessor.java:155)
at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:123)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:935)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:782)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:774)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:339)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1340)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329)
at com.example.emos.wx.EmosWxApiApplication.main(EmosWxApiApplication.java:16)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.lang.ClassCastException: class java.util.ArrayList cannot be cast to class springfox.documentation.spi.service.contexts.SecurityContext (java.util.ArrayList is in module java.base of loader 'bootstrap'; springfox.documentation.spi.service.contexts.SecurityContext is in unnamed module of loader 'app')
at springfox.documentation.spi.service.contexts.OperationContext$1.apply(OperationContext.java:94)
at com.google.common.collect.Iterators$6.computeNext(Iterators.java:617)
at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:145)
at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:140)
at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:249)
at com.google.common.collect.ImmutableList.copyOf(ImmutableList.java:209)
at com.google.common.collect.FluentIterable.toList(FluentIterable.java:614)
at springfox.documentation.spi.service.contexts.OperationContext.securityContext(OperationContext.java:90)
at springfox.documentation.swagger.readers.operation.OperationAuthReader.apply(OperationAuthReader.java:58)
at springfox.documentation.spring.web.plugins.DocumentationPluginsManager.operation(DocumentationPluginsManager.java:120)
at springfox.documentation.spring.web.readers.operation.ApiOperationReader.read(ApiOperationReader.java:73)
at springfox.documentation.spring.web.scanners.CachingOperationReader$1.load(CachingOperationReader.java:50)
at springfox.documentation.spring.web.scanners.CachingOperationReader$1.load(CachingOperationReader.java:48)
at com.google.common.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3628)
at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2336)
at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2295)
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2208)
... 31 common frames omitted
package com.example.emos.wx.config;
import io.swagger.annotations.ApiOperation;
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.service.ApiKey;
import springfox.documentation.service.AuthorizationScope;
import springfox.documentation.service.SecurityReference;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.ApiSelectorBuilder;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi(){
Docket docket=new Docket(DocumentationType.SWAGGER_2);
//配置Docket基本信息
ApiInfoBuilder builder=new ApiInfoBuilder();
builder.title("EMOS在线办公");
ApiInfo info=builder.build();
docket.apiInfo(info);
//哪些类的哪些方法要添加到swagger里面
ApiSelectorBuilder selectorBuilder=docket.select();
selectorBuilder.paths(PathSelectors.any());
selectorBuilder.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class));
selectorBuilder.build();
ApiKey apikey=new ApiKey("token","token","header");
List<ApiKey> list=new ArrayList<>();
list.add(apikey);
docket.securitySchemes(list);
//设定令牌作用域
AuthorizationScope scope=new AuthorizationScope("global","accessEverything");
AuthorizationScope[] scopes={scope};
SecurityReference reference=new SecurityReference("token",scopes);
List refList=new ArrayList();
refList.add(reference);
SecurityContext context=SecurityContext.builder().securityReferences(refList).build();
List ctxList=new ArrayList();
ctxList.add(ctxList);
docket.securityContexts(ctxList);
return docket;
}
}
上面是swagger的配置类,下面是主启动类,卡我好几天了奇怪的很
package com.example.emos.wx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@ServletComponentScan
@SpringBootApplication
public class EmosWxApiApplication {
public static void main(String[] args) {
SpringApplication.run(EmosWxApiApplication.class, args);
}
}
maven配置pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<springfox-swagger2-version>2.9.2</springfox-swagger2-version>
</properties>
<dependencies>
<!--swagger2-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox-swagger2-version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${springfox-swagger2-version}</version>
</dependency>
</dependencies>
Swagger2Config.java
package zzq.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.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* 〈功能简述〉<br>
* 〈swaggerConfig〉
*
* @author zhouzhiqiang
* @create 2018-12-04
*/
@Configuration
@EnableSwagger2
public class Swagger2Config {
/**
* swagger2的配置文件,这里可以配置swagger2的一些基本的内容,比如扫描的包等等
*
* @return Docket
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
// 为当前包路径
.apis(RequestHandlerSelectors.basePackage("zzq.controller")).paths(PathSelectors.any())
.build();
}
/**
* api文档的详细信息函数,注意这里的注解引用的是哪个
*
* @return
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
// //大标题
.title("Admin RESTful API")
// 版本号
.version("0.0.1-SNAPSHOT")
// 描述
.description("API 描述")
//作者
.contact(new Contact("zhouzhiqiang", "https://blog.csdn.net/qq_33594101", "2044579211@qq.com"))
.build();
}
}
访问路径
http://localhost:8080/swagger-ui.html#/
直接这样看,好像看不到问题,你要把配置的代码发出来,看下,应该是配置有问题
package com.ts.core.common.utils;
import com.github.xiaoymin.swaggerbootstrapui.model.OrderExtensions;
import com.google.common.collect.Lists;
import io.swagger.annotations.ApiOperation;
import org.springframework.stereotype.Component;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
/**
* 类文件: SwaggerUtil
* <p>
* <p>
* 类描述:
* <p>
* 作 者: AusKa_T
* <p>
* 日 期: 2021/4/21 0021
* <p>
* 时 间: 10:43
* <p>
*/
@Component
public class SwaggerUtil {
/**
* 创建API
*
* @param groupName 分组名称
* @param basePackage 扫描的包路径
* @param title 标题
* @param description 描述
* @return 结果
*/
public Docket createRestApi(String groupName, String basePackage, String title, String description) {
ParameterBuilder parameterBuilder = new ParameterBuilder();
List<Parameter> parameters = Lists.newArrayList();
parameterBuilder
.name("token")
.description("token令牌")
.modelRef(new ModelRef("String"))
.parameterType("header")
.defaultValue("Bearer")
.required(false).build();
parameters.add(parameterBuilder.build());
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo(title, description))
.groupName(groupName)
.select()
//加了ApiOperation注解的类,才生成接口文档
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//包下的类,才生成接口文档
.apis(RequestHandlerSelectors.basePackage(basePackage))
// .paths(PathSelectors.any())
.build()
.extensions(Lists.newArrayList(new OrderExtensions(1)))
.globalOperationParameters(parameters)
.securityContexts(Lists.newArrayList(securityContext()))
.securitySchemes(security());
}
/**
* 构建API info
*
* @param title 标题
* @return 结果
*/
private ApiInfo apiInfo(String title, String description) {
return new ApiInfoBuilder()
.title(title)
.description(description)
.termsOfServiceUrl("https://www.test.com")
.version("1.0.0")
.build();
}
/**
* 设置验证规则
*
* @return 结果
*/
private List<ApiKey> security() {
return newArrayList(
new ApiKey("token", "token", "header")
);
}
/**
* 设置数据验证规则
*
* @return 结果
*/
private SecurityContext securityContext() {
return SecurityContext.builder()
.securityReferences(defaultAuth())
.forPaths(PathSelectors.regex("/.*"))
.build();
}
/**
* 设置默认验证方式
*
* @return 结果
*/
List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
return Lists.newArrayList(new SecurityReference("token", authorizationScopes));
}
}
package com.ts.society.config;
import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import com.ts.core.common.utils.SwaggerUtil;
import com.ts.society.common.constants.SysConstants;
import com.ts.society.common.enums.Modules;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import javax.annotation.Resource;
/**
* 类文件: SwaggerConfig
* <p>
* <p>
* 类描述:Swagger配置
* <p>
* 作 者: AusKa_T
* <p>
* 日 期: 2021/5/7 0007
* <p>
* 时 间: 14:13
* <p>
*/
@Profile({"dev","test"})
@Configuration
@EnableSwagger2
@EnableSwaggerBootstrapUI
public class SwaggerConfig implements WebMvcConfigurer {
/**
* swagger工具类
*/
@Resource
private SwaggerUtil swaggerUtil;
/**
* 系统设置
* @return 结果
*/
@Bean
public Docket createRestSysApi() {
return swaggerUtil.createRestApi("系统设置","com.demo.modules.sys",""系统设置"", ""系统设置"");
}
}