我正在建立一个新的Solr服务器,我遇到了一个我在以前的Solr安装中没有遇到过的问题。当我导航到核心的“Dataimport”选项卡(甚至没有触发导入请求)时,管理UI发出的几个HTTP请求失败。检查Solr日志,我看到这个堆栈跟踪:
java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.String
at org.apache.solr.handler.dataimport.RequestInfo.<init>(RequestInfo.java:52)
at org.apache.solr.handler.dataimport.DataImportHandler.handleRequestBody(DataImportHandler.java:131)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:195)
at org.apache.solr.core.SolrCore.execute(SolrCore.java:2503)
at org.apache.solr.servlet.HttpSolrCall.execute(HttpSolrCall.java:711)
at org.apache.solr.servlet.HttpSolrCall.call(HttpSolrCall.java:517)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:384)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:330)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1629)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:219)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:335)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
at org.eclipse.jetty.server.Server.handle(Server.java:530)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:347)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:256)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:247)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:140)
at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:382)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626)
at java.lang.Thread.run(Thread.java:748)
当我从Admin UI开始数据导入时,或者实际上对/solr/<core>/dataimport*
端点发出任何HTTP请求时,会发生同样的错误。
我挖掘了源头,找到了发生这种情况的路线:https://github.com/apache/lucene-solr/blob/1d85cd783863f75cea133fb9c452302214165a4d/solr/contrib/dataimporthandler/src/java/org/apache/solr/handler/dataimport/RequestInfo.java#L52
if (requestParams.containsKey("command")) {
command = (String) requestParams.get("command");
}
我最好的猜测是,command
参数在某种程度上被包含在请求中两次,并且作为ArrayList
而不是String
。在我的solrconfig.xml
中,我定义了我的dataimportfull
处理程序,如下所示:
<requestHandler name="/dataimportfull" class="solr.DataImportHandler">
<lst name="defaults">
<str name="config">./DIHconfig.xml</str>
<str name="echoParams">explicit</str>
<str name="wt">json</str>
<str name="indent">true</str>
<str name="importType">full</str>
<str name="command">full-import</str>
<str name="commit">true</str>
<str name="clean">true</str>
<str name="update.chain">add-unknown-fields-to-the-schema</str>
</lst>
</requestHandler>
我尝试删除“命令”行,但错误仍然发生。
这个Solr实例和我设置的其他Solr服务器之间的主要区别在于,此实例在Windows Server 2016 Docker容器内运行,使用基于openjdk:8-jdk-windowsservercore-ltsc2016的映像。在这个容器里面,我正在运行Solr 7.3.1。
有关可能导致此错误的原因的任何想法?
弄清楚了。我的Solr设置没有任何问题。相反,反向代理(IIS)位于Solr前面是一个问题。我向Solr代理流量的方式是复制所有查询参数。
以下是帮助我解决问题的问题和答案:IIS URL Rewrite module repeats query string。