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
相关产品推荐
相关产品推荐

