Vavr Try.fold返回DataFetcherResult编译报错求助
解决Vavr Try.fold与GraphQL DataFetcherResult的类型匹配问题
让我们来拆解你遇到的问题——你以为是「失败分支需要抛出异常」导致的编译错误,其实核心是两个fold分支的返回类型不匹配,再加上对Vavr Try.fold方法的小误解。
问题根源剖析
- 对Try.fold的误解:Vavr的
Try.fold方法并不要求失败分支抛出异常,它的两个参数都是返回同一类型R的函数——失败分支接收Throwable返回R,成功分支接收Vehicle返回R。你完全可以在失败分支返回DataFetcherResult,不需要抛出任何东西。 - 类型不匹配的直接原因:你的失败分支代码只调用了
.error(...),但没有调用.build(),所以返回的是DataFetcherResult.Builder<Vehicle>;而成功分支调用了.build(),返回的是DataFetcherResult<Vehicle>。这两个类型不兼容,才导致了编译报错。
修正后的完整代码
只需要给失败分支补上.build(),让两个分支都返回DataFetcherResult<Vehicle>即可:
public DataFetcherResult<Vehicle> getVehicle() { return vehicleService.getVehicle() .fold( // 失败分支:补上build(),返回完整的DataFetcherResult exception -> DataFetcherResult.newResult() .error(new CustomGraphqlException(exception)) .build(), // 成功分支:保持原有逻辑即可 vehicle -> DataFetcherResult.newResult() .data(vehicle) .build() ); }
额外注意事项
- 确保
CustomGraphqlException实现了GraphQL的GraphQLError接口,这样GraphQL引擎才能正确识别并返回这个错误给客户端。 - 你的
vehicleService.getVehicle()中使用了findFirst().get(),如果buildVehicle()返回空流,会抛出NoSuchElementException,Try会自动捕获这个异常并进入失败分支。如果想更清晰,可以替换为findFirst().orElseThrow(() -> new VehicleNotFoundException()),自定义业务异常,让错误信息更明确。
内容的提问来源于stack exchange,提问作者CedricM
相关产品推荐
相关产品推荐

