bigywater.tech
Spring · 169

@ImportHttpServices 配了 base-url 还报 URI with undefined scheme:组名、starter 与默认组的规则

@ImportHttpServices 的分组客户端配了 base-url 为什么还报 URI with undefined scheme?组名、starter、默认组各是什么规则?这篇在 Spring Boot 4.0.8 上同一个调用逐个对照。

组名对不上
属性组名少写一个 s,启动日志没有任何 WARN 或 ERROR,第一次调用才抛 URI with undefined scheme
starter 决定属性生不生效
只引 spring-boot-starter-webmvc 时 spring.http.serviceclient.* 完全没被应用,和少配 base-url 的现象一样
default 组
@ImportHttpServices 不写 group 时,按 spring.http.serviceclient.default.* 配置

分组配置

实测 · 本机执行输出
  调用 UserClient.get(1):{team=blue, path=/up/users/1} (68 ms)
  调用 OrderClient.get(2):{team=null, path=/up/orders/2} (3 ms)

users 组配了 default-header,orders 组没有,收到的 X-Team 一个是 blue、一个是 null。

少配 base-url

实测 · 本机执行输出
  调用 UserClient.get(1):{path=/up/users/1, team=null} (55 ms)
  调用 OrderClient.get(2):异常 IllegalArgumentException:URI with undefined scheme (0 ms)

调用时抛 URI with undefined scheme,启动正常。

组名写错

实测 · 本机执行输出
  调用 UserClient.get(1):异常 IllegalArgumentException:URI with undefined scheme (7 ms)
  调用 OrderClient.get(2):{path=/up/orders/2, team=null} (42 ms)

属性组名少一个 s,启动日志干净,调用时才报错。

超时

实测 · 本机执行输出
  调用 UserClient.slow():异常 ResourceAccessException:I/O error on GET request for "http://127.0.0.1:9607/up/users/slow": Request cancelled (519 ms)
  调用 UserClient.get(1):{path=/up/users/1, team=null} (34 ms)

users 组 read-timeout=500ms,慢接口 519 ms 抛 ResourceAccessException。

同一个组

实测 · 本机执行输出
  调用 UserClient.get(1):{team=blue, path=/up/users/1} (57 ms)
  调用 OrderClient.get(2):{team=blue, path=/up/orders/2} (2 ms)

basePackageClasses 扫描的两个接口共用一份配置。

default 组

实测 · 本机执行输出
  调用 UserClient.get(1):{team=null, path=/up/users/1} (68 ms)
  调用 OrderClient.get(2):{team=null, path=/up/orders/2} (2 ms)

不写 group 的接口按 default 组配置。

缺 restclient starter

实测 · 本机执行输出
  调用 UserClient.get(1):异常 IllegalArgumentException:URI with undefined scheme (12 ms)
  调用 OrderClient.get(2):异常 IllegalArgumentException:URI with undefined scheme (0 ms)

只引 webmvc,属性不被应用。

引 webclient

实测 · 本机执行输出
  调用 UserClient.get(1):异常 ResourceAccessException:I/O error on GET request for "/users/1": Connection refused (connect failed): /[0:0:0:0:0:0:0:1]:80 (125 ms)
  调用 OrderClient.get(2):异常 ResourceAccessException:I/O error on GET request for "/orders/2": Connection refused (connect failed): /[0:0:0:0:0:0:0:1]:80 (1 ms)
  启动日志里的 WARN/ERROR:ERROR i.n.r.d.DnsServerAddressStreamProviders - Unable to load io.netty.resolver.dns.macos.MacOSDnsServerAddressStreamProvider, fallback to system defaults. This may result in incorrect DNS resolution

引 webclient 的 starter 而没有 restclient 的,base-url 也没被应用。

分步演示

ImportHttp
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / OpenJDK 21.0.12(Homebrew) / Spring Boot 4.0.8(Spring Framework 7.0.9、Tomcat 11.0.24) / Spring Cloud 2025.1.3;用 javac 编译、java 直接运行,依赖由 Maven 从 Maven Central 解析;数字每次运行会有小幅抖动(Spring Boot 4.0.8,Spring Framework 7.0.9;同一个应用既当调用方也当被调方,被调方回显收到的路径和 X-Team 请求头;每种配置启动一次应用后各调用一次;类路径:starter-webmvc 加 starter-restclient(前六步),只有 starter-webmvc(第七步),starter-webmvc 加 starter-webclient(第八步);spring.http.serviceclient 属性名来自 spring-boot-http-client 4.0.8 的配置元数据)
    • 没有验证:@ImportHttpServices 的 clientType 取 WEB_CLIENT 时的行为;webclient 与 restclient 的 starter 同时存在时的选择;apiversion、ssl.bundle、redirects 等其它分组属性;orders 组在 read-timeout 实验里的超时行为(那一步没有请求它);HttpServiceGroupConfigurer 编程式配置与属性配置同时存在时的优先级;为什么第八步的报错和第七步不同
    京ICP备2026067502号-1京公网安备11010502063487号