Изменение ключей MultivalueMap вызывает ConcurrentModificationException

У меня есть MultivalueMap и TreeMap, оба имеют ключ-значение типа String.

Я хочу изменить любой ключ в моей MultivalueMap на ключи, найденные в моей TreeMap.

Это мой код, почему я получаю ConcurrentModificationException и как его решить?

public RestRequest(MultivaluedMap<String, Object> myHeaders,TreeMap<String, String> testParameters) {
    this.testParameters = testParameters;
    buildUrl();     
    Client client = ClientBuilder.newClient();

    Set<String> keys = myHeaders.keySet();
    for (String key : keys) {
        myHeaders.remove(key);
        myHeaders.add(key, testParameters.get(key));
    }
    this.myHeaders = myHeaders;
    myResource = client.target(URL);
    entity=Entity.entity(replaceRequestBodyWithParams(requestBody), MediaType.APPLICATION_JSON);
}  

person Tal Angel    schedule 31.01.2019    source источник
comment
Дубликат составляет около Lists, но то же самое происходит с каждым Collection, как в вашем случае Set   -  person Lino    schedule 31.01.2019


Ответы (1)


Вы не можете изменить базовую коллекцию, которую вы повторяете. Вы перебираете keySet карты и в цикле пытаетесь изменить эту карту, что также изменит набор ключей.

Лучшим способом добиться того, что вы пытаетесь сделать в этом методе, было бы создание новой структуры данных, подобной этой:

public RestRequest(MultivaluedMap<String, Object> myHeaders,TreeMap<String, String> testParameters) {
    this.testParameters = testParameters;
    buildUrl();     
    Client client = ClientBuilder.newClient();

    Set<String> keys = myHeaders.keySet();
    final Map<String, String> testParamsByHeader = new HashMap<>();

    for (String key : keys)
        testParamsByHeader.add(key, testParameters.get(key));
    }
    this.myHeaders = testParamsByHeader;
    myResource = client.target(URL);
    entity=Entity.entity(replaceRequestBodyWithParams(requestBody), MediaType.APPLICATION_JSON);
}  
person Daniel W.    schedule 31.01.2019