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

WildFly 27 GraphQL注入RoutingContext失败,求获取BearerToken方案

解决方案:在WildFly 27 MicroProfile GraphQL中获取Bearer Token

问题原因

直接@Inject RoutingContext失败是因为RoutingContext是Vert.x Web的专属上下文对象,WildFly的MicroProfile GraphQL Featurepack并未将其注册为CDI可管理的Bean,因此CDI容器无法找到对应的实例,抛出WELD-001408依赖不满足错误。

以下是三种符合Jakarta EE/MicroProfile规范的可行解决方案:


方案1:注入Jakarta EE HttpServletRequest 获取请求头

直接使用Java EE标准的HttpServletRequest读取请求头,WildFly自带该API支持:

@GraphQLApi
@ApplicationScoped
public class FilmResource {

    @Inject
    GalaxyService service;

    @Inject
    HttpServletRequest request;

    @Query("allFilms")
    @Description("Get all Films from a galaxy far far away")
    public List<Film> getAllFilms() {
        // 获取Authorization请求头
        String authHeader = request.getHeader("Authorization");
        String bearerToken = null;
        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            // 去除"Bearer "前缀,提取纯token
            bearerToken = authHeader.substring(7);
        }
        // 将token传入业务逻辑使用
        return service.getAllFilms(bearerToken);
    }
}

如果是Maven项目,只需声明Servlet API依赖(WildFly已内置,无需打包):

<dependency>
    <groupId>jakarta.servlet</groupId>
    <artifactId>jakarta.servlet-api</artifactId>
    <version>5.0.0</version>
    <scope>provided</scope>
</dependency>

方案2:使用@Context注入Jakarta RS HttpHeaders

MicroProfile GraphQL支持通过@Context注解注入Jakarta RS的HttpHeaders对象,直接读取请求头:

import jakarta.ws.rs.core.HttpHeaders;
import jakarta.ws.rs.core.Context;

@GraphQLApi
@ApplicationScoped
public class FilmResource {

    @Inject
    GalaxyService service;

    @Context
    HttpHeaders httpHeaders;

    @Query("allFilms")
    @Description("Get all Films from a galaxy far far away")
    public List<Film> getAllFilms() {
        String authHeader = httpHeaders.getHeaderString(HttpHeaders.AUTHORIZATION);
        String bearerToken = null;
        if (authHeader != null && authHeader.startsWith("Bearer ")) {
            bearerToken = authHeader.substring(7);
        }
        return service.getAllFilms(bearerToken);
    }
}

方案3:基于MicroProfile JWT直接处理认证令牌

如果你的Bearer Token符合JWT标准,可使用MicroProfile JWT API直接注入令牌对象,简化认证逻辑:

  1. 引入MicroProfile JWT依赖(WildFly已内置):
<dependency>
    <groupId>org.eclipse.microprofile.jwt</groupId>
    <artifactId>microprofile-jwt-auth-api</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
</dependency>
  1. 注入JsonWebToken对象获取令牌信息:
import org.eclipse.microprofile.jwt.JsonWebToken;

@GraphQLApi
@ApplicationScoped
public class FilmResource {

    @Inject
    GalaxyService service;

    @Inject
    JsonWebToken jwt;

    @Query("allFilms")
    @Description("Get all Films from a galaxy far far away")
    public List<Film> getAllFilms() {
        // 获取原始JWT令牌字符串
        String rawToken = jwt.getRawToken();
        // 或直接读取令牌中的Claim信息,比如用户名
        String username = jwt.getName();
        
        return service.getAllFilms(rawToken);
    }
}

该方案若需验证令牌有效性,需配置WildFly的JWT安全域;仅提取令牌字符串则无需额外配置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:40:34