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

使用HttpGraphQLClient时Mono.onErrorResume()出现语法错误的解决咨询

修复HttpGraphQlClient retrieve方法的onErrorResume语法错误并正确处理GraphQL错误

修复后的代码示例

Mono<TransactionEntity> entity = this.graphQlClient.documentName("getDetails")
        .variables(Map.of("xx", "xx"))
        .retrieve("data")
        .toEntity(TransactionEntity.class)
        .onErrorResume(FieldAccessException.class, ex -> {
            ClientGraphQlResponse response = ex.getResponse();
            // 这里添加你的错误处理逻辑,比如日志记录、错误信息解析
            ClientResponseField field = ex.getField();
            // 必须返回符合类型要求的Mono实例
            return Mono.empty(); // 示例:返回空结果,可根据业务替换为其他Mono类型
        });

错误原因分析

你碰到的Cannot resolve method 'onErrorResume(Class, )'语法错误,本质是lambda表达式缺少符合要求的返回值。

从给出的候选方法签名能看到,onErrorResume(Class<T>, Function<? super T, ? extends Mono<? extends R>>)要求第二个参数的Function必须返回Mono<? extends TransactionEntity>类型,但你的原代码里只有错误处理逻辑,没有return语句返回对应的Mono对象,导致编译器无法匹配到正确的方法重载。

用retrieve()处理GraphQL错误的正确方式

使用retrieve()方法时,框架会在以下场景抛出FieldAccessException:

  • 请求的字段在GraphQL响应中携带错误信息
  • 字段值无法反序列化为指定的实体类型

处理这类错误的步骤:

  1. 通过ex.getResponse()获取完整的GraphQL响应,可解析响应中所有的错误细节
  2. 通过ex.getField()定位到具体出错的字段,方便排查问题
  3. 根据业务需求返回对应的Mono结果:
    • 允许空结果:返回Mono.empty()
    • 需要默认值:返回Mono.just(new TransactionEntity())(替换为你的默认实体)
    • 向上层抛自定义异常:返回Mono.error(new CustomBusinessException("获取详情失败", ex))

如果需要处理网络错误、服务不可达等非GraphQL字段级错误,可额外添加其他onErrorResume重载:

.onErrorResume(IOException.class, ex -> {
    // 处理网络类异常
    return Mono.error(new ServiceUnavailableException("GraphQL服务连接失败", ex));
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:32:40