RestAssured 5.3.1配置503重试策略遇类型转换异常求助
RestAssured 5.3.1 配置503重试策略时类型转换异常的解决办法
问题原因
出现org.codehaus.groovy.runtime.typehandling.GroovyCastException是因为RestAssured 5.3.1的HttpClientConfig要求httpClientFactory返回org.apache.http.impl.client.AbstractHttpClient实例,但HttpClientBuilder.build()生成的InternalHttpClient继承自CloseableHttpClient,并非AbstractHttpClient的子类,导致类型不兼容。
方案一:使用RestAssured封装的重试配置(推荐)
RestAssured已经封装了对Apache HttpClient重试策略的支持,不需要手动构建HttpClient实例,直接通过HttpClientConfig配置即可:
import io.restassured.config.HttpClientConfig; import org.apache.http.impl.client.DefaultServiceUnavailableRetryStrategy; import java.time.Duration; HttpClientConfig httpClientConfig = HttpClientConfig.httpClientConfig() .setParam("http.connection.timeout", Duration.ofSeconds(30).toMillis()) .setParam("http.socket.timeout", Duration.ofSeconds(30).toMillis()) .setParam("http.connection-manager.timeout", Duration.ofSeconds(30).toMillis()) // 配置默认的503重试策略(默认3次重试,间隔1秒) .setServiceUnavailableRetryStrategy(new DefaultServiceUnavailableRetryStrategy()); config = RestAssured.config().httpClient(httpClientConfig);
如果需要自定义重试次数和间隔:
// 自定义:最多重试5次,每次间隔2秒 .setServiceUnavailableRetryStrategy(new DefaultServiceUnavailableRetryStrategy(5, 2000))
方案二:自定义过滤器实现重试
如果需要更灵活的重试逻辑(比如根据响应内容判断是否重试),可以通过RestAssured的Filter接口实现,完全避开HttpClient的类型问题:
import io.restassured.filter.Filter; import io.restassured.filter.FilterContext; import io.restassured.response.Response; import io.restassured.specification.FilterableRequestSpecification; import io.restassured.specification.FilterableResponseSpecification; public class Retry503Filter implements Filter { private final int maxRetries; private final long delayMillis; public Retry503Filter(int maxRetries, long delayMillis) { this.maxRetries = maxRetries; this.delayMillis = delayMillis; } @Override public Response filter(FilterableRequestSpecification requestSpec, FilterableResponseSpecification responseSpec, FilterContext ctx) { Response response = ctx.next(requestSpec, responseSpec); int retryCount = 0; while (response.getStatusCode() == 503 && retryCount < maxRetries) { retryCount++; try { Thread.sleep(delayMillis); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; } // 重新发起请求 response = ctx.next(requestSpec, responseSpec); } return response; } }
注册过滤器到RestAssured:
// 注册过滤器:最多重试3次,每次间隔1秒 RestAssured.filters(new Retry503Filter(3, 1000));
内容的提问来源于stack exchange,提问作者Rejish R
相关产品推荐
相关产品推荐

