elasticsearch,rest-client,Java,elasticsearch,Rest Client" /> elasticsearch,rest-client,Java,elasticsearch,Rest Client" />

Elasticsearch Rest客户端引发java.lang.ArrayStoreException

Elasticsearch Rest客户端引发java.lang.ArrayStoreException,java,elasticsearch,rest-client,Java,elasticsearch,Rest Client,我正在使用Elasticsearch Rest客户端v5.5.3在Java应用程序中执行Elasticsearch查询。它总是抛出java.lang.ArrayStoreException。首先,我怀疑查询执行的频率,因为应用程序密集地执行查询,但它在第一次查询时抛出异常。其次,我更新了一些依赖项,如Elasticsearch rest客户端使用的ApacheHttpCore.jar。但无论哪种方式,我都不知道如何解决它,仍然抛出异常。堆栈跟踪在下面 java.lang.ArrayStoreEx

我正在使用Elasticsearch Rest客户端v5.5.3在Java应用程序中执行Elasticsearch查询。它总是抛出java.lang.ArrayStoreException。首先,我怀疑查询执行的频率,因为应用程序密集地执行查询,但它在第一次查询时抛出异常。其次,我更新了一些依赖项,如Elasticsearch rest客户端使用的ApacheHttpCore.jar。但无论哪种方式,我都不知道如何解决它,仍然抛出异常。堆栈跟踪在下面

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;
    }

问题描述

问题的根本原因是由于冲突导致的“JAR地狱”
httpclient-4.5.2
flux-core-1.1.0
。我不知道为什么,但是
flux-core-1.1.0
jar包含完整的httpclient代码库版本4.3.3,它与4.5.2不兼容

什么是
ArrayStoreException
,Javadoc报价:

公共类ArrayStoreException扩展了引发到的RuntimeException 表示试图存储错误类型的数据 对象转换为对象数组。例如,下面的代码 生成ArrayStoreException: 对象x[]=新字符串[3]; x[0]=新整数(0)

在版本httpclient-4.3.3
RFC2965VersionAttributeHandler

@Immutable
public class RFC2965VersionAttributeHandler implements CookieAttributeHandler {
@Immutable
public class RFC2965VersionAttributeHandler implements CommonCookieAttributeHandler {
在版本httpclient-4.5.2
RFC2965VersionAttributeHandler

@Immutable
public class RFC2965VersionAttributeHandler implements CookieAttributeHandler {
@Immutable
public class RFC2965VersionAttributeHandler implements CommonCookieAttributeHandler {
以及
DefaultCookieSpec
中的问题,该问题试图使用4.3.3中的
RFC2965VersionAttributeHandler
调用版本4.5.2的
RFC2965Spec
的构造函数,而该构造函数未实现
CommonCookieAttributeHandler

RFC2965Spec(final boolean oneHeader,
            final CommonCookieAttributeHandler... handlers) {
    super(oneHeader, handlers);
}
解决方案


“JAR地狱”最可能的原因是您的
pom.xml
(或gradle)依赖于
httpclient-4.5.2
。您应该将其从依赖项中删除或降级到
4.3.3
版本。此外,您的
pom.xml
可能对
httpasyncclient-4.1.2
有依赖关系-在这种情况下,您还可以将其从依赖关系中删除或降级到
4.0.x
版本。值得一提的是,您的项目可能对
httpclient
httpacyncclient
具有可传递的依赖关系-在这种情况下,您需要找到并修复它。

问题描述

问题的根本原因是由于冲突导致的“JAR地狱”
httpclient-4.5.2
flux-core-1.1.0
。我不知道为什么,但是
flux-core-1.1.0
jar包含完整的httpclient代码库版本4.3.3,它与4.5.2不兼容

什么是
ArrayStoreException
,Javadoc报价:

公共类ArrayStoreException扩展了引发到的RuntimeException 表示试图存储错误类型的数据 对象转换为对象数组。例如,下面的代码 生成ArrayStoreException: 对象x[]=新字符串[3]; x[0]=新整数(0)

在版本httpclient-4.3.3
RFC2965VersionAttributeHandler

@Immutable
public class RFC2965VersionAttributeHandler implements CookieAttributeHandler {
@Immutable
public class RFC2965VersionAttributeHandler implements CommonCookieAttributeHandler {
在版本httpclient-4.5.2
RFC2965VersionAttributeHandler

@Immutable
public class RFC2965VersionAttributeHandler implements CookieAttributeHandler {
@Immutable
public class RFC2965VersionAttributeHandler implements CommonCookieAttributeHandler {
以及
DefaultCookieSpec
中的问题,该问题试图使用4.3.3中的
RFC2965VersionAttributeHandler
调用版本4.5.2的
RFC2965Spec
的构造函数,而该构造函数未实现
CommonCookieAttributeHandler

RFC2965Spec(final boolean oneHeader,
            final CommonCookieAttributeHandler... handlers) {
    super(oneHeader, handlers);
}
解决方案


“JAR地狱”最可能的原因是您的
pom.xml
(或gradle)依赖于
httpclient-4.5.2
。您应该将其从依赖项中删除或降级到
4.3.3
版本。此外,您的
pom.xml
可能对
httpasyncclient-4.1.2
有依赖关系-在这种情况下,您还可以将其从依赖关系中删除或降级到
4.0.x
版本。值得一提的是,您的项目可能对
httpclient
httpasyncclient
具有可传递的依赖关系-在这种情况下,您需要找到并修复它。

如果出于某种原因,您无法更改依赖关系或这样做不方便,还有另一种解决方案。如果使用或依赖于有问题的依赖项,那么代码中可以有两个不同版本的相同库。在这种情况下,这可能是矫枉过正,但作为解决方案之一,仍然值得一提。谢谢您的回答。无论我如何从flux core中排除依赖项,它都不起作用。我对依赖项标记使用了排除,并使用shade将包从依赖项中排除。它们都不起作用您不能从
flux core
中排除某些内容,因为它是一个包含
httpclient
中的类的jar。尝试找出哪些组件也有
httpclient
作为依赖项。F.e.具有
mvn依赖关系:tree-Dverbose-Dincludes=httpclient
用于Maven。Elasticsearch rest客户端(v5.5.3)具有httpclient依赖关系。我认为我应该找到一种从apache storm flux core中排除的方法,因为我无法降级Elasticsearch rest客户端的版本。如果出于某种原因,您无法更改依赖项或这样做不方便,还有另一种解决方案。如果使用或依赖于有问题的依赖项,那么代码中可以有两个不同版本的相同库。在这种情况下,这可能是矫枉过正,但作为解决方案之一,仍然值得一提。谢谢您的回答。无论我如何从flux core中排除依赖项,它都不起作用。我对依赖项标记使用了排除,并使用shade将包从依赖项中排除。它们都不起作用您不能从
flux core
中排除某些内容,因为它是一个包含
httpclient
中的类的jar。尝试找出哪些组件也有
httpclient
作为依赖项。F.e.具有
mvn依赖关系:tree-Dverbose-Dincludes=httpclient
用于Maven。Elasticsearch rest客户端(v5.5.3)具有httpclient依赖关系。我想我应该找到一种方法,从apache storm flux core中排除s