Spring WebClient传入含JSON值查询参数时变量展开异常如何解决?
问题根因
你遇到的报错是Spring UriBuilder的默认机制导致的:它会把URI中包含{}的片段识别为URI模板变量,尝试匹配对应变量值做替换。你传入的JSON参数值里的大括号被误识别为模板占位符,系统找不到对应名称的变量才抛出Not enough variable values available to expand异常。
通用解决方案(全参数适用,无需单独处理filter)
只需要修改URI构建逻辑,禁用模板变量解析即可,改法非常简单:
return webClient.get() .uri(uriBuilder -> uriBuilder.path("/nodes/last") .queryParams(queryParams) .build(false)) // 仅新增这一个参数即可 .header(HttpHeaders.AUTHORIZATION, token) .accept(MediaType.APPLICATION_JSON) .retrieve() .bodyToMono(String.class) .log();
build(false)的作用是告知UriBuilder:不需要处理URI模板变量,仅对传入的参数值做标准的URL编码后拼接。不管参数值是JSON还是普通字符串,都可以正常处理,符合你要转发全部参数的需求。
全局配置方案(可选)
如果你这个WebClient实例所有请求都不需要用到URI模板变量功能,可以在初始化时全局配置,后续所有请求都不用单独加build(false):
DefaultUriBuilderFactory uriFactory = new DefaultUriBuilderFactory(); // 关闭模板变量解析,仅做参数编码 uriFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.URI_COMPONENT); WebClient webClient = WebClient.builder() .uriBuilderFactory(uriFactory) // 其他配置如baseUrl、拦截器等 .build();
内容的提问来源于stack exchange,提问作者kamilguti
相关产品推荐
相关产品推荐

