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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 10:32:44