为什么 UriComponentsBuilder 忽略空查询参数?

ero*_*dem 6 java spring-mvc

我正在尝试构建一个 url UriComponentsBuilder

UriComponentsBuilder.fromUriString(BASE)
                .pathSegment("api")
                .pathSegment("v1")
                .queryParam("param1", userId) //userId in null
                .queryParam("param2",productId) //productId 12345
                .build().toUriString();
Run Code Online (Sandbox Code Playgroud)

我得到的结果如下所示。

"http://localhost/api/v1?param1=&param2=12345"
Run Code Online (Sandbox Code Playgroud)

当这些查询参数之一为 null 时,我根本不希望该参数键成为 url 的一部分。那么当参数为空时如何动态构造URL呢?我期望这样的事情:

"http://localhost/api/v1?param2=12345"
Run Code Online (Sandbox Code Playgroud)

小智 17

我认为您可能想使用UriComponentsBuilder::queryParamIfPresent而不是您当前正在使用的功能。

来自官方文档:

如果查询参数的值不是 ,则此函数将添加一个查询参数Optional::empty。如果为空,则根本不会添加该参数。

要将您的变成null一个Optional,请使用Optional::ofNullable.

代码示例:

UriComponentsBuilder.fromUriString(BASE)
    .pathSegment("api")
    .pathSegment("v1")
    .queryParamIfPresent("param1", Optional.ofNullable(userId)) // UserId is null
    .queryParamIfPresent("param2", Optional.ofNullable(productId)) // ProductId 12345
    .build()
    .toUriString();
Run Code Online (Sandbox Code Playgroud)

这将导致 URI 中不param1包含查询字符串。但是,param2将被添加到查询字符串中,因为该字符串不为空。

希望这可以帮助你。

干杯!

-T