Spring WebClient类型转换异常:LambdaMonoSubscriber无法转为RestClient.RequestHeadersSpec
问题:WebClient调用接口时抛出ClassCastException
我使用Spring WebClient调用/ValidateTaxId接口,代码执行时控制台抛出ClassCastException,提示reactor.core.publisher.LambdaMonoSubscriber无法转换为org.springframework.web.client.RestClient$RequestHeadersSpec。虽然业务逻辑能正常处理,但该错误始终存在,想咨询错误产生的原因。
实现代码
RestClient.RequestHeadersSpec<?> spec = (RestClient.RequestHeadersSpec<?>) webClient .post() .uri("/ValidateTaxId") .body(BodyInserters.fromValue(validateTaxIdRequestDTO)) .accept(MediaType.APPLICATION_JSON) .header("jwtToken", validateTaxIdRequestDTO.getSessionHeaderRequestDTO().getJwtToken()) .header("entidad", validateTaxIdRequestDTO.getSessionHeaderRequestDTO().getEntidad()) .retrieve() .toEntity(ValidateTaxIdResponseDTO.class) .subscribe(result -> { // get results as usual final ValidateTaxIdResponseDTO validateTaxIdResponseDTO = result.getBody(); validateTaxIdResponseDTO.setMessage(result.getStatusCode().toString()); validateTaxIdResponseDTO.getSessionHeaderResponseDTO().setJwtToken(result.getHeaders().get("jwtToken").toString()); List<String> ti = result.getHeaders().get("transactionID"); // call the ui with the data callback.operationFinished(validateTaxIdResponseDTO); }, error -> { final ValidateTaxIdResponseDTO validateTaxIdResponseDTO = new ValidateTaxIdResponseDTO(); Throwable demo = error.getCause(); validateTaxIdResponseDTO.setValid(false); validateTaxIdResponseDTO.setTaxIdFormated(""); validateTaxIdResponseDTO.setMessage("Error...."); // call the ui with the data callback.operationFinished(validateTaxIdResponseDTO); });
报错信息
java.lang.ClassCastException: class reactor.core.publisher.LambdaMonoSubscriber cannot be cast to class org.springframework.web.client.RestClient$RequestHeadersSpec (reactor.core.publisher.LambdaMonoSubscriber and org.springframework.web.client.RestClient$RequestHeadersSpec are in unnamed module of loader 'app')
错误原因分析
核心问题是错误的类型强制转换:
webClient.post()...retrieve().toEntity().subscribe()这条链式调用的最终返回值是Disposable(具体实现类为LambdaMonoSubscriber),而非RestClient.RequestHeadersSpec。- 你错误地将整个链式调用的结果强制转换为
RestClient.RequestHeadersSpec类型,这直接触发了类型转换异常。 - 业务逻辑能正常执行是因为
subscribe()方法已经触发了请求的执行,类型转换异常不会中断订阅逻辑的运行,但会在控制台抛出错误日志。
修正方案
不需要将调用结果赋值给RestClient.RequestHeadersSpec类型变量,直接执行链式调用即可;如果需要控制订阅的生命周期,可将结果赋值给Disposable类型:
Disposable disposable = webClient .post() .uri("/ValidateTaxId") .body(BodyInserters.fromValue(validateTaxIdRequestDTO)) .accept(MediaType.APPLICATION_JSON) .header("jwtToken", validateTaxIdRequestDTO.getSessionHeaderRequestDTO().getJwtToken()) .header("entidad", validateTaxIdRequestDTO.getSessionHeaderRequestDTO().getEntidad()) .retrieve() .toEntity(ValidateTaxIdResponseDTO.class) .subscribe(result -> { // 业务逻辑保持不变 final ValidateTaxIdResponseDTO validateTaxIdResponseDTO = result.getBody(); validateTaxIdResponseDTO.setMessage(result.getStatusCode().toString()); validateTaxIdResponseDTO.getSessionHeaderResponseDTO().setJwtToken(result.getHeaders().get("jwtToken").toString()); List<String> ti = result.getHeaders().get("transactionID"); callback.operationFinished(validateTaxIdResponseDTO); }, error -> { // 错误处理逻辑保持不变 final ValidateTaxIdResponseDTO validateTaxIdResponseDTO = new ValidateTaxIdResponseDTO(); Throwable demo = error.getCause(); validateTaxIdResponseDTO.setValid(false); validateTaxIdResponseDTO.setTaxIdFormated(""); validateTaxIdResponseDTO.setMessage("Error...."); callback.operationFinished(validateTaxIdResponseDTO); });
内容的提问来源于stack exchange,提问作者FxGodino
相关产品推荐
相关产品推荐

