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

升级Dropwizard Swagger后Swagger页面无API_KEY输入框问题

升级Dropwizard Swagger后API_KEY输入框消失的解决方法

升级Dropwizard及Swagger依赖后,Swagger页面的API_KEY输入框不再显示,无法输入OAuth令牌。原依赖与升级后依赖如下:

原Maven依赖:

<dependencies>
    <dependency>
        <groupId>io.dropwizard</groupId>
        <artifactId>dropwizard-core</artifactId>
        <version>0.8.0</version>
    </dependency>
    <dependency>
        <groupId>io.federecio</groupId>
        <artifactId>dropwizard-swagger</artifactId>
        <version>0.7.0</version>
    </dependency>
</dependencies>

升级后Maven依赖:

<dependency>
    <groupId>io.dropwizard</groupId>
    <artifactId>dropwizard-core</artifactId>
    <version>2.1.4</version>
</dependency>
<dependency>
    <groupId>com.smoketurner</groupId>
    <artifactId>dropwizard-swagger</artifactId>
    <version>2.0.12-1</version>
</dependency>

原因与解决方案

新版com.smoketurner:dropwizard-swagger基于OpenAPI 3.0规范,不再默认启用API_KEY授权输入框,需要显式配置安全方案来恢复授权功能。

步骤1:配置Swagger安全方案

在Application类的initialize方法中,为SwaggerBundleConfiguration添加SecurityScheme和SecurityContext配置:

示例1:API_KEY(Header令牌)配置

@Override
public void initialize(Bootstrap<YourAppConfiguration> bootstrap) {
    // 初始化Swagger配置
    SwaggerBundleConfiguration swaggerConfig = new SwaggerBundleConfiguration();
    
    // 定义API_KEY类型的安全方案
    SecurityScheme apiKeyScheme = new SecurityScheme()
        .type(SecurityScheme.Type.APIKEY)
        .name("Authorization") // 请求头中的令牌字段名,如Bearer令牌使用Authorization
        .in(SecurityScheme.In.HEADER);
    
    // 注册安全方案
    Map<String, SecurityScheme> securitySchemes = new HashMap<>();
    securitySchemes.put("api_key", apiKeyScheme);
    swaggerConfig.setSecuritySchemes(securitySchemes);
    
    // 全局启用该安全方案(可选,也可仅在特定接口启用)
    SecurityRequirement securityReq = new SecurityRequirement();
    securityReq.addList("api_key");
    swaggerConfig.setSecurityContexts(Collections.singletonList(securityReq));
    
    // 基础Swagger配置
    swaggerConfig.setTitle("你的API名称");
    swaggerConfig.setVersion("1.0.0");
    swaggerConfig.setResourcePackage("com.yourcompany.api.resources"); // 你的API资源包路径
    
    // 添加Swagger Bundle
    bootstrap.addBundle(new SwaggerBundle<YourAppConfiguration>() {
        @Override
        protected SwaggerBundleConfiguration getSwaggerBundleConfiguration(YourAppConfiguration configuration) {
            return swaggerConfig;
        }
    });
}

示例2:OAuth2隐式授权配置

如果需要OAuth2授权输入框,可替换SecurityScheme为:

SecurityScheme oAuth2Scheme = new SecurityScheme()
    .type(SecurityScheme.Type.OAUTH2)
    .flow(SecurityScheme.Flow.IMPLICIT)
    .authorizationUrl("https://你的授权服务器地址/oauth/authorize") // 授权地址
    .scopes(new Scopes()
        .addString("read:api", "读取API数据权限")
        .addString("write:api", "写入API数据权限"));

securitySchemes.put("oauth2", oAuth2Scheme);
securityReq.addList("oauth2");

步骤2:为接口添加安全要求(可选)

如果不需要全局启用授权,可在单个Resource类或方法上添加@SecurityRequirement注解,指定使用的安全方案:

@Path("/users")
@Produces(MediaType.APPLICATION_JSON)
@SecurityRequirement(name = "api_key") // 启用api_key安全方案
public class UserResource {
    // 接口方法...
}

完成配置后重启服务,Swagger页面会显示Authorize按钮,点击后即可输入API令牌或进行OAuth授权。

内容的提问来源于stack exchange,提问作者Pradip Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:40:30