"ArrayList cannot be cast to java.lang.String" Solr DIH 端点上的错误消息
"ArrayList cannot be cast to java.lang.String" error message on Solr DIH endpoints
我正在设置一个新的 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.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.run(QueuedThreadPool.java:626)
at java.lang.Thread.run(Thread.java:748)
当我开始从管理员 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>
我尝试删除 "command" 行,但错误仍然存在。
此 Solr 实例与我设置的其他 Solr 服务器之间的主要区别在于,此实例 运行 在 Windows Server 2016 Docker 容器内,使用图片基于 openjdk:8-jdk-windowsservercore-ltsc2016。在这个容器中,我是 运行 Solr 7.3.1.
关于可能导致此错误的原因有什么想法吗?
想通了。我的 Solr 设置没有任何问题。相反,这是位于 Solr 前面的反向代理 (IIS) 的问题。我将流量代理到 Solr 的方式是复制所有查询参数。
以下是帮助我解决问题的问答:IIS URL Rewrite module repeats query string。
我正在设置一个新的 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.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.run(QueuedThreadPool.java:626)
at java.lang.Thread.run(Thread.java:748)
当我开始从管理员 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>
我尝试删除 "command" 行,但错误仍然存在。
此 Solr 实例与我设置的其他 Solr 服务器之间的主要区别在于,此实例 运行 在 Windows Server 2016 Docker 容器内,使用图片基于 openjdk:8-jdk-windowsservercore-ltsc2016。在这个容器中,我是 运行 Solr 7.3.1.
关于可能导致此错误的原因有什么想法吗?
想通了。我的 Solr 设置没有任何问题。相反,这是位于 Solr 前面的反向代理 (IIS) 的问题。我将流量代理到 Solr 的方式是复制所有查询参数。
以下是帮助我解决问题的问答:IIS URL Rewrite module repeats query string。