You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 15:43:23