Spring 的 URIComponentsBuilder 将端口号的冒号 (:) 转换为斜线 (/)

Spring's URIComponentsBuilder converts colon (:) for port number into slash (/)

在测试中,我将一个示例 URL 与冒号表示端口号 ("http://example.com:port") 注入到我的配置中,然后我的生产代码使用它来构造一个UriComponentsBuilder 最终创建一个 URI 字符串。

但是,该冒号字符正被 UriComponentsBuilder 转换为正斜杠,如 MCVE 中所示:

@Test
public void portNumberFromHttpUrl() {
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://example.com:port");

    String uriString = builder.toUriString();

    assertThat(uriString).isEqualTo("http://example.com:port");
}

本次测试失败如下:

org.junit.ComparisonFailure:
Expected :"http://example.com:port"
Actual :"http://example.com/port"

为什么 : 被转换为 /

MCVE 几乎立即帮我自己回答了这个问题,但我会把问题留在这里,因为我在这里或网上其他任何地方都找不到相同的问题,我想这可能会节省其他人一些时间:

看来UriComponentsBuilder认识到一个端口应该是一个数字,所以这个(更现实的)案例通过了:

@Test
public void portNumberFromHttpUrl() {
    UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://example.com:123");

    String uriString = builder.toUriString();

    assertThat(uriString).isEqualTo("http://example.com:123");
}

从更多的调查来看,它似乎在 : 之后遇到的第一个非数字字符之前放置了 /,因此:

http://example.com:a123 -> http://example.com/a123
http://example.com:12a3 -> http://example.com:12/a3
http://example.com:123a -> http://example.com:123/a

不是很明显,但我想是有道理的。