嘿,我有一个包含多个查询参数的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方法的输入。
我希望这能解决您的问题。