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

Java中20个响应式异步API调用的错误处理与代码优化

优化方案

1. 统一DTO基础类

先抽一个基础DTO类,把所有业务DTO共有的status字段和相关方法统一起来,避免每个DTO重复实现:

public abstract class BasePartnerDTO {
    private String status;

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}

让你的所有业务DTO都继承这个基础类:

public class MailboxProvidersDTO extends BasePartnerDTO {
    // 原有业务字段和方法
}

public class TimeZonesDTO extends BasePartnerDTO {
    // 原有业务字段和方法
}
// 其他17个DTO同理修改

2. 封装泛型工具方法

把重复的API调用、重试、日志、错误处理逻辑打包成一个泛型方法,放在你的业务类或者单独的工具类里:

private <T extends BasePartnerDTO> Mono<T> callPartnerApiWithHandling(String url, Class<T> dtoClass, String successLogMsg) {
    return partnerAsyncService.asyncCallPartnerApi(url, dtoClass)
            .retryWhen(getRetrySpec())
            .doOnSuccess(res -> {
                log.info(Logger.EVENT_SUCCESS, successLogMsg);
                res.setStatus("Success");
            })
            .onErrorResume(BusinessException.class, ex -> {
                log.error(Logger.EVENT_FAILURE, ex.getMessage());
                try {
                    // 反射实例化对应的DTO作为降级返回
                    T fallbackDto = dtoClass.getDeclaredConstructor().newInstance();
                    fallbackDto.setStatus("Failed");
                    return Mono.just(fallbackDto);
                } catch (Exception e) {
                    log.error(Logger.EVENT_FAILURE, "Failed to create fallback DTO for " + dtoClass.getName(), e);
                    return Mono.empty();
                }
            });
}

3. 简化API调用代码

现在每个API调用只需要一行代码,传入对应的URL、DTO类和成功日志文本即可:

Mono<MailboxProvidersDTO> mailboxProvidersDTOMono = callPartnerApiWithHandling(
        getMailboxProvidersUrl, 
        MailboxProvidersDTO.class, 
        "Mailbox Providers report successfully retrieved."
);

Mono<TimeZonesDTO> timeZonesDTOMono = callPartnerApiWithHandling(
        getTimeZonesUrl, 
        TimeZonesDTO.class, 
        "Time Zones report successfully retrieved."
);

Mono<RegionsDTO> regionsDTOMono = callPartnerApiWithHandling(
        getRegionsUrl, 
        RegionsDTO.class, 
        "Regions report successfully retrieved."
);

// 剩余17个API调用全部按此格式简化

补充说明

  • 泛型约束T extends BasePartnerDTO保证了所有传入的DTO都能调用setStatus方法,避免类型错误。
  • 反射实例化降级DTO的前提是所有业务DTO都有无参构造,如果有带参构造,需要调整反射逻辑或者统一DTO的构造方式。
  • 后续要修改错误处理、日志格式或重试规则时,只需要修改这个泛型方法,不用逐个修改20处调用代码,维护成本大幅降低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:01:22