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

Java EE/Jersey中为Swagger UI添加Bearer Token字段的问题

解决Swagger UI中JWT Bearer Token输入字段不显示的问题

看起来你遇到的问题主要是几个注解配置的细节错误,加上重复定义和错误参数导致Swagger UI无法正确识别你的JWT安全方案。我帮你一步步梳理并修正:

1. 移除重复的@SecurityScheme定义

你在ApplicationConfig和ItemsResource中都定义了相同的@SecurityScheme,这会导致OpenAPI文档中出现重复的安全方案条目,Swagger UI可能无法正确解析。只保留一处定义,推荐放在ApplicationConfig中:

@SecurityScheme(
    securitySchemeName = "JWT",
    description = "JWT authentication with bearer token",
    type = SecuritySchemeType.HTTP,
    scheme = "bearer",
    bearerFormat = "JWT" // 这里修正:该字段是标识token格式,不是模板,填"JWT"即可
)
public class ApplicationConfig extends Application { }

2. 修正ItemsResource中的安全注解

去掉ItemsResource中重复的@SecurityScheme,同时修正@SecurityRequirement的scopes配置(你的写法格式错误,且如果没有定义具体scope的话可以直接省略该属性):

@Path("/items")
@OpenAPIDefinition(
    info = @Info(title = "Items resource", version = "v1"),
    security = @SecurityRequirement(name = "JWT") // 全局生效的安全要求
)
@Transactional(value = TxType.REQUIRES_NEW)
@Interceptors({RolesAllowedInterceptor.class})
public class ItemsResource {
    (...)
    @GET
    @Operation(description = "Returns the item list overview")
    @APIResponse(responseCode = "200", description = "Valid response")
    @APIResponse(responseCode = "401", description = "Authentication required")
    @APIResponse(responseCode = "500", description = "Unexpected exception")
    @Produces({MediaType.APPLICATION_JSON})
    @SecurityRequirement(name = "JWT") // 方法级安全要求,全局已加的话可以省略
    @RolesAllowed({Constants.USER_ROLE_EXPERT})
    public Response getItemListOverview() throws TechnicalException {
        ItemListOverviewVO itemListOverviewVO = logic.getItemListOverview();
        return Response.status(Status.OK).entity(itemListOverviewVO).build();
    }
}

3. 移除手动添加的@HeaderParam

你添加的@HeaderParam("Authorization")会干扰Swagger UI的自动安全处理逻辑:Swagger UI原本会通过识别@SecurityScheme自动生成"Authorize"按钮,以及自动在请求中携带Authorization头,但手动添加的参数会让UI显示一个独立的输入框,且可能无法正确将输入值带入请求头中。

4. 验证效果

重启你的应用后,打开Swagger UI:

  • 右上角会出现Authorize按钮
  • 点击按钮后,在弹出的对话框中输入你的JWT token(格式为 Bearer <你的token内容>)
  • 发送请求时,浏览器的网络请求中就能看到正确携带的Authorization头了

关键错误点总结

  • bearerFormat参数误用:它是用来描述token的格式类型(比如"JWT"),而不是定义请求头的模板
  • 重复的安全方案定义导致Swagger UI解析混乱
  • 错误的scopes格式:该属性是字符串数组,且只有当你定义了具体的scope时才需要填写
  • 手动添加@HeaderParam干扰了Swagger UI的自动安全机制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:15:40