Spring Boot中Swagger Schema未生成securitySchemes求助
Spring Boot中Swagger2生成OpenAPI Schema时components缺失securitySchemes问题
我在Spring Boot应用中配置了Swagger2相关代码,但生成的OpenAPI Schema里,components下未生成securitySchemes。
现有代码片段
pom.xml
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> <exclusions> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-bean-validators</artifactId> <version>2.9.2</version> </dependency>
Swagger配置类及控制器
@Configuration @EnableSwagger2 @Import(BeanValidatorPluginsConfiguration.class) @Profile({"dev", "localhost"}) public class SwaggerConfiguration { private String accessTokenUri = "http://localhost:8080/oauth/token"; @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("myapi.demo.controller")) .build() .apiInfo(metaData()) .protocols(protocols()) .securitySchemes(Arrays.asList(securitySchemes())) .securityContexts(securityContexts()); } @SuppressWarnings("rawtypes") private ApiInfo metaData() { return new ApiInfo( "demo API", "The demo endpoint returns information about the my sample Api.", "1.0", "", new Contact("DEV", "", "Dev@abc.com"), "DEV", "", new ArrayList<VendorExtension>()); } private Set<String> protocols() { Set<String> protocols = new HashSet<>(); protocols.add("http"); return protocols; } private List<SecurityReference> defaultAuth() { final AuthorizationScope[] authorizationScopes = { new AuthorizationScope("read", "read all") }; return Collections.singletonList(new SecurityReference("oauth2", authorizationScopes)); } private List<SecurityContext> securityContexts() { List<SecurityContext> securityContexts = Arrays.asList( SecurityContext.builder() .forPaths(PathSelectors.any()) .securityReferences(defaultAuth()) .build() ); return securityContexts; } private OAuth securitySchemes() { List<AuthorizationScope> authorizationScopeList = new ArrayList<>(); authorizationScopeList.add(new AuthorizationScope("read", "read all")); List<GrantType> grantTypes = new ArrayList<>(); GrantType passwordCredentialsGrant = new ResourceOwnerPasswordCredentialsGrant(accessTokenUri); grantTypes.add(passwordCredentialsGrant); return new OAuth("oauth2", authorizationScopeList, grantTypes); } } // 移除控制器上的@SecurityScheme注解 @RestController @RequestMapping("") //@CrossOrigin(origins = "*",allowedHeaders = "*") public class MyDemoController { // ... 控制器方法 }
期望效果
希望生成的Swagger Schema中,components下包含带有OAuth2详情的securitySchemes。
解决方案
1. 移除控制器上的@SecurityScheme注解
@SecurityScheme是OpenAPI 3.0的注解,而你使用的是Swagger 2.0(DocumentationType.SWAGGER_2),springfox 2.9.2对OpenAPI 3.0注解的兼容性较差,这个注解会干扰Swagger 2.0的securitySchemes生成,必须移除。
2. 确认SecurityReference与SecurityScheme名称一致
你的代码中defaultAuth()方法里的SecurityReference名称是"oauth2",securitySchemes()方法返回的OAuth对象名称也是"oauth2",这部分是正确的,确保两者名称完全匹配,否则关联会失效。
3. 清理缓存并重启应用
Spring Boot的缓存可能导致配置未及时生效,清理应用缓存后重启,重新访问Swagger文档生成Schema。
完成以上步骤后,components下的securitySchemes应该会正常生成包含OAuth2的相关配置。
内容的提问来源于stack exchange,提问作者Gopikrishna X Gopalakrishnan
相关产品推荐
相关产品推荐

