将Spring WebFlux项目转换为Spring MVC的最优方案咨询
WebFlux转Spring MVC的最优方案分析
你的RestTemplate实现方向是对的,但还有几个细节可以优化,让它更贴近原WebFlux方法的行为,同时符合Spring MVC的最佳实践。
一、原WebFlux方法的核心行为复盘
先明确原方法的关键逻辑,确保转换后行为一致:
- 发起GET请求获取
CoreErrorResponse集合 - 发生任何错误时打印错误日志,返回空集合
- 请求超时后同样返回空集合
二、你的RestTemplate实现的优化点
- 补充超时配置
原WebFlux方法有明确的超时时间readTimeOutTranslateList,当前实现未配置RestTemplate的超时,会使用框架默认值,可能不符合业务预期。需要在RestTemplate的Bean配置中添加超时参数:
@Bean public RestTemplate restTemplate() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); // 可根据需求添加连接超时,这里只配置读取超时对齐原逻辑 factory.setReadTimeout((int) Duration.ofSeconds(readTimeOutTranslateList).toMillis()); return new RestTemplate(factory); }
- 修复数组转List的潜在问题
Arrays.asList()返回的是固定大小的List,无法执行add/remove操作,若后续业务需要修改集合会抛出UnsupportedOperationException。建议转成可修改的ArrayList,同时增加空值判断避免NPE:
CoreErrorResponse[] responseArray = restTemplate.getForObject(url, CoreErrorResponse[].class); return responseArray == null ? Collections.emptyList() : new ArrayList<>(Arrays.asList(responseArray));
- 异常捕获逻辑确认
RestClientException已经覆盖了RestTemplate调用时的所有异常(包括连接超时、读取超时、HTTP错误等),错误时打印日志并返回空List的逻辑,和原方法的onErrorResume行为完全一致,这部分无需调整。
三、第二个方法findMonoMyError的转换
原WebFlux方法是同步返回Mono包装的对象,转成Spring MVC直接返回实体类即可——因为Mono.just是同步创建的,Spring MVC场景下不需要异步包装:
public MyClassErrorResponse findMonoMyError(final String token, final MyClassResponse myclass) { return finError(myclass); }
四、最终优化后的完整实现
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class MyService { private final RestTemplate restTemplate; private final Logger log = LoggerFactory.getLogger(MyService.class); public MyService(RestTemplate restTemplate) { this.restTemplate = restTemplate; } private List<CoreErrorResponse> myMethodName() { try { String url = buildListErrorsUrl().toUriString(); CoreErrorResponse[] responseArray = restTemplate.getForObject(url, CoreErrorResponse[].class); return responseArray == null ? Collections.emptyList() : new ArrayList<>(Arrays.asList(responseArray)); } catch (RestClientException e) { log.error("failed: {}", e.getMessage()); return Collections.emptyList(); } } public MyClassErrorResponse findMonoMyError(final String token, final MyClassResponse myclass) { return finError(myclass); } }
内容的提问来源于stack exchange,提问作者EDG
相关产品推荐
相关产品推荐

