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

如何捕获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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:06:02