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

Spring WebClient调用DocuSign POST接口解析异常 无法提取access_token

问题根因说明

你遇到的问题来自两个核心编码错误:

  • 第一版代码直接打印retrieve()返回的ResponseSpec对象:这个对象是WebClient用来组装响应处理规则的中间操作对象,本身不存储实际响应内容,直接调用toString()只会输出对象的内存地址,不会返回接口响应数据。
  • 第二版反序列化失败的核心原因是参数传递位置错误:DocuSign的OAuth2令牌接口遵循RFC6749规范,要求grant_type、assertion等参数必须以application/x-www-form-urlencoded格式放在POST请求体中,你把参数拼接在URL查询串中不符合接口要求,会导致接口返回非JSON格式的错误响应,最终触发JSON反序列化异常。另外你没有显式指定Accept请求头,部分场景下服务端会返回非JSON格式的响应,也会导致解析失败。
正确实现代码

如果你只需要提取access_token字段,不需要额外定义POJO类,直接将响应解析为Map取值即可,参考以下可直接运行的代码:

import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
import java.util.Map;

public class DocuSignAuthUtil {
    public static String accessToken(String jwtToken) {
        WebClient webClient = WebClient.create();

        return webClient.post()
                .uri("https://account-d.docusign.com/oauth/token")
                // 显式声明接收JSON格式响应
                .accept(MediaType.APPLICATION_JSON)
                // 声明请求体为表单格式
                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                // 将接口要求的参数放在表单请求体中,不要拼接在URL上
                .body(BodyInserters.fromFormData("grant_type", "urn:ietf:params:oauth:grant-type:jwt-bearer")
                        .with("assertion", jwtToken))
                .retrieve()
                // 提前处理4xx/5xx错误响应,避免模糊的反序列化异常
                .onStatus(HttpStatus::isError, resp -> 
                        resp.bodyToMono(String.class)
                                .flatMap(err -> Mono.error(new RuntimeException("令牌接口请求失败: " + err)))
                )
                // 解析响应为Map结构,直接取access_token字段
                .bodyToMono(Map.class)
                .block()
                .get("access_token")
                .toString();
    }
}
补充说明
  • 如果你希望保留自定义JwtToken POJO的写法,只需要修正上述参数传递逻辑和请求头,将bodyToMono(Map.class)替换为bodyToMono(JwtToken.class)即可正常反序列化。
  • 上述代码中的block()是阻塞调用,如果你在Spring WebFlux非阻塞响应式链路中使用,不要调用block(),直接将方法返回值改为Mono<String>,在响应式链路中逐步处理结果即可。

内容的提问来源于stack exchange,提问作者Oze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:03:27