Клиент Elasticsearch Rest выдает исключение java.lang.ArrayStoreException

Я использую Elasticsearch Rest Client v5.5.3 для выполнения запросов Elasticsearch в приложении Java. Всегда выдает java.lang.ArrayStoreException. Во-первых, я подозреваю частоту выполнения запросов, поскольку приложение интенсивно выполняет запросы, но выдает исключение в самом первом запросе. Во-вторых, я обновляю некоторые зависимости, такие как Apache HttpCore.jar, которые использует клиент Elasticsearch rest. Но так или иначе я не мог придумать, как ее решить, все равно выбрасывает исключение. След стека находится ниже;

java.lang.ArrayStoreException: org.apache.http.impl.cookie.RFC2965VersionAttributeHandler
    at org.apache.http.impl.cookie.DefaultCookieSpecProvider.create(DefaultCookieSpecProvider.java:92) ~[httpclient-4.5.2.jar:4.5.2]
    at org.apache.http.client.protocol.RequestAddCookies.process(RequestAddCookies.java:152) ~[flux-core-1.1.0.jar:1.1.0]
    at org.apache.http.protocol.ImmutableHttpProcessor.process(ImmutableHttpProcessor.java:132) ~[flux-core-1.1.0.jar:1.1.0]
    at org.apache.http.impl.nio.client.MainClientExec.prepareRequest(MainClientExec.java:520) ~[httpasyncclient-4.1.2.jar:4.1.2]
    at org.apache.http.impl.nio.client.MainClientExec.prepare(MainClientExec.java:146) ~[httpasyncclient-4.1.2.jar:4.1.2]
    at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.start(DefaultClientExchangeHandlerImpl.java:124) ~[httpasyncclient-4.1.2.jar:4.1.2]
    at org.apache.http.impl.nio.client.InternalHttpAsyncClient.execute(InternalHttpAsyncClient.java:141) ~[httpasyncclient-4.1.2.jar:4.1.2]
    at org.elasticsearch.client.RestClient.performRequestAsync(RestClient.java:343) ~[rest-5.5.3.jar:5.5.3]
    at org.elasticsearch.client.RestClient.performRequestAsync(RestClient.java:325) ~[rest-5.5.3.jar:5.5.3]
    at org.elasticsearch.client.RestClient.performRequest(RestClient.java:218) ~[rest-5.5.3.jar:5.5.3]
    at org.elasticsearch.client.RestClient.performRequest(RestClient.java:191) ~[rest-5.5.3.jar:5.5.3]
    at com.nova.stats.platform.are.batch.rule.ElasticsearchQueryExecutor.execute(ElasticsearchQueryExecutor.java:36) [classes/:?]

Метод выполняет запросы;

public String execute(String query, QueryParameters parameters) throws IOException {
        String index = (String) parameters.getParameter(GlobalConfigurations.ElasticsearchConfigurations.ConfigurationFields.INDEX);
        String type = (String) parameters.getParameter(GlobalConfigurations.ElasticsearchConfigurations.ConfigurationFields.TYPE);

        RestClient restClient = ElasticsearchRestClient.getClient();
        HttpEntity entity;
        Response response = null;
        try {
            entity = new NStringEntity(query);
            response = restClient.performRequest("GET", "/" + index + "/" + type + "/_search",
                    Collections.singletonMap("pretty", "true"), entity);
        } catch (Exception e) {
            logger.error("Could not perform request, query: " + query, e);
        }

        String responseStr = responseStr = EntityUtils.toString(response.getEntity());


        return responseStr;
    }

1 ответ

Решение

Описание проблемы

Основная причина проблемы - "JAR Hell" из-за конфликтов httpclient-4.5.2 а также flux-core-1.1.0, Не знаю почему но flux-core-1.1.0 В jar содержится полная версия кода базы HTTPclient 4.3.3, которая не совместима с 4.5.2.

Что такое ArrayStoreExceptionJavadoc цитата:

открытый класс ArrayStoreException расширяет RuntimeException Thrown, чтобы указать, что была предпринята попытка сохранить объект неправильного типа в массиве объектов. Например, следующий код генерирует ArrayStoreException: Object x[] = new String[3]; x[0] = новое целое число (0);

В версии httpclient-4.3.3 RFC2965VersionAttributeHandler похоже

@Immutable
public class RFC2965VersionAttributeHandler implements CookieAttributeHandler {

В версии httpclient-4.5.2 RFC2965VersionAttributeHandler похоже

@Immutable
public class RFC2965VersionAttributeHandler implements CommonCookieAttributeHandler {

И проблема в DefaultCookieSpec который пытается вызвать конструктор RFC2965Spec версии 4.5.2 с RFC2965VersionAttributeHandler из 4.3.3, который не реализуется CommonCookieAttributeHandler:

RFC2965Spec(final boolean oneHeader,
            final CommonCookieAttributeHandler... handlers) {
    super(oneHeader, handlers);
}

Решение

Наиболее вероятная причина "JAR Hell" - ваш pom.xml (или Gradle) имеет зависимость для httpclient-4.5.2, Вы должны удалить его из зависимостей или понизить до 4.3.3 версия. Также ваш pom.xml может иметь зависимость для httpasyncclient-4.1.2 - в этом случае вы также можете удалить его из зависимостей или понизить до 4.0.x версия. Ценность вашего проекта может иметь переходную зависимость для httpclient или же httpasyncclient - в таком случае вам нужно найти и исправить это.

Другие вопросы по тегам