嘿,我有一个包含多个查询参数的URL-用于搜索。这是仇恨链接

https://someurl/customers?customer-id={customer-id}&type={type}&something={something}


我只希望替换两个参数

Map<String, String> params = new HashMap<>();
    params.put("customer-id", customerId);
    params.put("something", something)

    UriComponents customerUrl = UriComponentsBuilder
          .fromHttpUrl(specialURL)
          .buildAndExpand(params).encode();


但这引发了。

java.lang.IllegalArgumentException: Map has no value for 'type'
    at org.springframework.web.util.UriComponents$MapTemplateVariables.getValue(UriComponents.java:346) ~[spring-web-5.0.8.RELEASE.jar:5.0.8.RELEASE]


最好的解决方法是什么,比方说,我有大约7个参数,用空字符串或将字符串切成两半来代替它们似乎很麻烦。

最佳答案

UriComponents始终希望所有关键数据都必须存在于映射中,以下是UriComponents使用的引发异常的代码。

@Override
public Object getValue(String name) {
    if (!this.uriVariables.containsKey(name)) {
        throw new IllegalArgumentException("Map has no value for '" + name + "'");
    }
    return this.uriVariables.get(name);
}


解:

因此,要解决您的问题,您可以尝试以下代码。

class Param extends HashMap<String, String>{


    @Override
    public String get(Object key) {
        if(!super.containsKey(key)){
            super.put(key.toString(), "");
        }
        return super.getOrDefault(key, "t");
    }

    @Override
    public boolean containsKey(Object arg0) {
        return true;
    }
}

public class UriComponenet {

    public static void main(String[] args) {

        Param params = new Param();
        params.put("customer-id", "1");
        String specialURL="https://someurl/customers?customer-id={customer-id}&type={type}&something={something}";
        UriComponents customerUrl = UriComponentsBuilder
              .fromHttpUrl(specialURL)
              .buildAndExpand(params).encode();

        System.out.println(customerUrl);
    }
}


我已经将HashMap类扩展到Param,然后将该类用作buildAndExpand方法的输入。

我希望这能解决您的问题。

07-25 21:21