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直接注入令牌对象,简化认证逻辑:
- 引入MicroProfile JWT依赖(WildFly已内置):
<dependency> <groupId>org.eclipse.microprofile.jwt</groupId> <artifactId>microprofile-jwt-auth-api</artifactId> <version>2.0</version> <scope>provided</scope> </dependency>
- 注入
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
相关产品推荐
相关产品推荐

