UriComponentsBuilder多次调用path方法的行为不符合预期的疑问
path() Method Behavior 你对UriComponentsBuilder的path()方法行为理解确实存在偏差,这也是很多刚接触这个类的开发者容易踩的坑。
先解释下为什么你的测试用例会得到onetwothree而非预期的one/two/three:
虽然path()方法内部调用了pathBuilder.addPath(),但这个方法的逻辑并不是自动为你添加路径分隔符/,而是直接将传入的字符串原封不动地追加到现有路径的末尾。所以三次调用path("one")、path("two")、path("three"),本质就是把这三个字符串直接拼接在一起,自然得到了onetwothree。
正确的实现方式
如果你想生成用斜杠分隔的多段路径,有两种常用的正确做法:
1. 手动添加路径分隔符(使用path())
如果你坚持用path()方法,需要在每个路径段的开头或结尾手动加上斜杠,确保段与段之间被分隔:
@Test public void testFunctioning(){ String url = UriComponentsBuilder.newInstance() .path("one/") .path("two/") .path("three") .toUriString(); assertEquals("one/two/three", url); // 测试通过 }
或者也可以在每个路径段开头加斜杠,不过这样会生成带开头斜杠的路径(/one/two/three),如果不需要开头的斜杠,后续可以额外处理。
2. 使用pathSegment()方法(推荐)
UriComponentsBuilder专门提供了pathSegment()方法来处理多段路径,它会自动帮你用斜杠分隔各个独立的路径段,不需要手动添加分隔符:
@Test public void testFunctioning(){ String url = UriComponentsBuilder.newInstance() .pathSegment("one", "two", "three") .toUriString(); assertEquals("one/two/three", url); // 测试通过 }
你也可以分多次调用pathSegment(),效果是一样的:
String url = UriComponentsBuilder.newInstance() .pathSegment("one") .pathSegment("two") .pathSegment("three") .toUriString();
补充说明:为什么path()要这么设计?
path()方法的设计初衷是允许开发者传入任意格式的路径字符串——比如你可能需要直接添加一个包含斜杠的路径片段(比如path("users/profile")),如果它自动添加斜杠,反而会破坏你传入的路径结构。而pathSegment()则是专门为拆分的路径段设计的,所以会自动处理分隔逻辑。
内容的提问来源于stack exchange,提问作者Gaurav

