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 метод.
Надеюсь, это решит вашу проблему.