UriComponentsBuilder - как заменить некоторые из queryParams и удалить неиспользуемые? - PullRequest
0 голосов
/ 11 октября 2018

Эй, у меня есть этот URL, который содержит несколько параметров запроса - он используется для поиска.Это ссылка hatehoas

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 параметров, замена их пустой строкой или разрезание строки пополам кажется довольно хакерской.

1 Ответ

0 голосов
/ 11 октября 2018

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 метод.

Надеюсь, это решит вашу проблему.

...