javax.ws.rs.client.WebTarget 可选查询参数

Posted

技术标签:

【中文标题】javax.ws.rs.client.WebTarget 可选查询参数【英文标题】:javax.ws.rs.client.WebTarget optional queryparam 【发布时间】:2020-12-22 05:10:40 【问题描述】:

我正在调用支持一堆可选查询参数的下游。

同样,我只是有时想添加这些查询参数,但这样做有点烦人

public Map<Subject, Role> getGrantsForResource(
        final String propertyId,
        final boolean filterByRole
) 
    final WebTarget resource;
    if (filterByRole) 
        resource = ramClient
                .path("/v1/resource/resource/grants")
                .resolveTemplate("resource", "resource.property." + propertyId)
                .queryParam("role", "role.23"); //add queryparam
     else 
        resource = ramClient
                .path("/v1/resource/resource/grants")
                .resolveTemplate("resource", "resource.property." + propertyId);
                //don't add queryparam
    

如果有多个可选的查询参数会导致组合爆炸。

始终添加查询参数,但在不需要时将值设为空字符串或 null 也不起作用 - 添加值为 null 的查询参数会导致 NPE,发送空字符串会导致添加查询参数,但没有价值。

我想出了这个解决方法

public Map<Subject, Role> getGrantsForResource(
        final String propertyId,
        final Map<String, String> queryParams
) 

    WebTarget resource = ramClient
            .path("/v1/resource/resource/grants")
            .resolveTemplate("resource", "resource.property." + propertyId);

    for (Map.Entry<String, String> e : queryParams.entrySet()) 
        if (e.getValue() == null) 
            //don't add queryparam
         else 
            resource = resource.queryParam(e.getKey(), e.getValue());
        
    

但肯定有更好的方法吗?

【问题讨论】:

在我看来使用地图很好。不要以为你会找到任何 API 让这看起来更干净。 【参考方案1】:

您可以在构造 WebTarget 时跳过空值。

public Map<Subject, Role> getGrantsForResource(
    final String propertyId,
    final Map<String, String> queryParams) 

    WebTarget resource = ramClient
        .path("/v1/resource/resource/grants")
        .resolveTemplate("resource", "resource.property." + propertyId);

    for (Map.Entry<String, String> entry : queryParams.entrySet()) 
        if (entry.getValue() != null) 
              webTarget = webTarget.queryParam(entry.getKey(), entry.getValue());
        
    
    
    // use webTarget ...

【讨论】:

以上是关于javax.ws.rs.client.WebTarget 可选查询参数的主要内容,如果未能解决你的问题,请参考以下文章