如何捕获Quarkus抛出的UnauthorizedException并自定义GraphQL接口401响应
Quarkus GraphQL 认证异常自定义处理方案
- 第一步:实现自定义GraphQL异常映射器
Quarkus集成的SmallRye GraphQL提供了GraphQLExceptionMapper扩展点,可直接捕获数据抓取阶段抛出的各类异常,无需修改业务代码,实现类会被Quarkus自动识别注册,示例代码如下:
import io.quarkus.security.UnauthorizedException; import io.smallrye.graphql.spi.ErrorContext; import io.smallrye.graphql.spi.GraphQLExceptionMapper; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.Map; @ApplicationScoped public class UnauthorizedExceptionMapper implements GraphQLExceptionMapper<UnauthorizedException> { @Inject HttpServletResponse response; @Override public Class<UnauthorizedException> getExceptionType() { return UnauthorizedException.class; } @Override public List<graphql.GraphQLError> toErrors(ErrorContext errorContext, UnauthorizedException exception) { // 设置HTTP 401状态码 response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 构造自定义错误返回 graphql.GraphQLError error = graphql.GraphQLError.newError() .message("当前请求未携带有效身份凭证,请先登录") .locations(errorContext.getLocations()) .path(errorContext.getPath()) .extensions(Map.of("classification", "UNAUTHORIZED")) .build(); return List.of(error); } }
- 第二步:可选配置调整
如果需要隐藏异常的内部堆栈信息,可在application.properties中添加如下配置:
# 关闭异常堆栈的默认暴露 quarkus.smallrye-graphql.show-error-stack-trace=false # 自定义返回的extensions字段,不需要可直接移除 quarkus.smallrye-graphQL.error-extension-fields=classification
- 验证效果
配置完成后,未携带Authorization头请求fetchUsers接口时,会返回HTTP 401状态码,错误报文的message字段会替换为你自定义的提示内容,不会再返回null值。
内容的提问来源于stack exchange,提问作者Park Jay
相关产品推荐
相关产品推荐

