首页 > 解决方案 > Spring 的 URIComponentsBuilder 将端口号的冒号 (:) 转换为斜杠 (/)

问题描述

在测试中,我将带有冒号的端口号(“ http://example.com:port ”)的示例 URL 注入到我的配置中,然后我的生产代码使用它来构造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:
预期:“ http://example.com:port
实际:“ http://example.com/port

为什么:正在转换为 a /

标签: spring-web

解决方案


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");
}

从更多的调查来看,它似乎将 a 放在/它在 a 之后遇到的第一个非数字字符之前:,所以:

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

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


推荐阅读