使用SolrJ管理索引库时,报错:java.lang.NoSuchMethodError: org.apache.http.impl.conn.PoolingHttpClie...

问题描述

今天碰到一个问题,那就是在使用SolrJ管理索引库时,报了一个如下这样一个错误,具体错误信息记录如下:

java.lang.NoSuchMethodError: org.apache.http.impl.conn.PoolingHttpClientConnectionManager.setValidateAfterInactivity(I)V
	at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:279)
	at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:330)
	at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:268)
	at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:255)
	at org.apache.solr.client.solrj.impl.HttpSolrClient.<init>(HttpSolrClient.java:204)
	at org.apache.solr.client.solrj.impl.HttpSolrClient$Builder.build(HttpSolrClient.java:952)
	at com.taotao.search.test.SolrJTest.testSolrJAddDocument(SolrJTest.java:19)

下面我给出了我的测试代码,你能看懂我写的啥吗?
使用SolrJ管理索引库时,报错:java.lang.NoSuchMethodError: org.apache.http.impl.conn.PoolingHttpClie...
这里,我还得说明一点,我使用的Solr是Solr 8.4.0这个版本。

报错原因

根据堆栈错误信息,咱们从下往上一直追踪,可以发现org.apache.solr.client.solrj.impl.HttpClientUtil类的createClient方法会调用org.apache.http.impl.conn.PoolingHttpClientConnectionManager类的setValidateAfterInactivity方法,但是在org.apache.http.impl.conn.PoolingHttpClientConnectionManager类中压根就没有setValidateAfterInactivity方法,所以就会报出java.lang.NoSuchMethodError这样的异常了。

解决方案

报错原因找到了,就是因为org.apache.http.impl.conn.PoolingHttpClientConnectionManager类中压根就没有setValidateAfterInactivity这个方法。

那么怎么解决这个错误呢?这个org.apache.http.impl.conn.PoolingHttpClientConnectionManager类在httpclient-4.3.5.jar(SolrJ的依赖包)中,该jar包中的org.apache.http.impl.conn.PoolingHttpClientConnectionManager类确实是没有setValidateAfterInactivity这个方法的。
使用SolrJ管理索引库时,报错:java.lang.NoSuchMethodError: org.apache.http.impl.conn.PoolingHttpClie...
这就很很明显了,就是因为httpclient的版本有问题。从上图可以看出,我使用的httpclient的版本是4.3.5,版本太低了,就导致了该版本jar包中的org.apache.http.impl.conn.PoolingHttpClientConnectionManager类没有setValidateAfterInactivity这个方法。

分析至此,解决方案就呼之欲出了,就是将使用的httpclient的版本调高点,例如修改成4.5.6

注意,父工程的pom文件是用于统一管理依赖版本号的,新建的工程依赖父工程的时候,就会继承父工程的pom文件中定义的依赖版本号信息,所以,当我们修改了父工程的pom文件,尤其是修改了版本号之后,一定要记得先clean一下父工程再重新install一下,如果你不这样做的话,那么后续会碰到一些问题会搞死你!

本文地址:https://blog.csdn.net/yerenyuan_pku/article/details/107485467

猜你喜欢