【问题标题】:Class Cast Exception when querying SOLR查询 SOLR 时出现类强制转换异常
【发布时间】:2019-03-08 19:46:13
【问题描述】:

尝试查询我的 SOLR 7.5.0 独立集合时出现以下异常。我不确定问题出在哪里或如何调试它。我目前在我的 maven 项目中使用 solr 7.5.0 依赖项,并且我尝试使用 7.6.0 和 7.4.0 并且它们产生相同的异常。我正在寻找其他方法来尝试找出问题所在以及如何解决它。

导致异常的行是this

QueryResponse resp = httpSolrClient.query(query, METHOD.GET );

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to org.apache.solr.common.SolrDocumentList
    at org.apache.solr.client.solrj.response.QueryResponse.setResponse(QueryResponse.java:126)
    at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:194)
    at org.apache.solr.client.solrj.SolrClient.query(SolrClient.java:974)
    at org.apache.solr.client.solrj.SolrClient.query(SolrClient.java:990)
    at com.leidos.textanalysis.solr.QuerySolr.main(QuerySolr.java:28)

下面是导致它的代码,并且没有任何修改它会产生任何结果变化。

public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
    NoOpResponseParser responseParser = new NoOpResponseParser();
    responseParser.setWriterType("xml");

    HttpSolrClient.Builder builder = new HttpSolrClient.Builder();
    builder.withBaseSolrUrl("http://host:8983/solr/collection");

    RequestWriter writer = new RequestWriter();
    HttpSolrClient httpSolrClient = builder. build();
    httpSolrClient.setRequestWriter(writer);
    httpSolrClient.setParser(responseParser); 
    //message score
    SolrQuery query =new SolrQuery("*:*"); 

    QueryResponse resp = httpSolrClient.query(query, METHOD.GET ); //Exception thrown here

    SolrDocumentList theList =  resp.getResults();
    SolrDocument test = theList.get(0);
    System.out.println(test.toString());
}

查看 solr 中 QueryResponse 的源代码,我们可以看到问题出在它转换为 SolrDocumentList 的地方。我找不到解决此问题或修复它的方法。我正在寻找可以尝试的东西和解决更多问题的选项。谢谢。

public void setResponse( NamedList<Object> res )  {
super.setResponse( res );

// Look for known things
for( int i=0; i<res.size(); i++ ) {
  String n = res.getName( i );
  if( "responseHeader".equals( n ) ) {
    _header = (NamedList<Object>) res.getVal( i );
  }
  else if( "response".equals( n ) ) {
    _results = (SolrDocumentList) res.getVal( i ); //Exception thrown Here 
  }
  else if( "sort_values".equals( n ) ) {
    _sortvalues = (NamedList<ArrayList>) res.getVal( i );
  }
  else if( "facet_counts".equals( n ) ) {
    _facetInfo = (NamedList<Object>) res.getVal( i );
    // extractFacetInfo inspects _results, so defer calling it
    // in case it hasn't been populated yet.
  }
  else if( "debug".equals( n ) ) {
    _debugInfo = (NamedList<Object>) res.getVal( i );
    extractDebugInfo( _debugInfo );
  }
  else if( "grouped".equals( n ) ) {
    _groupedInfo = (NamedList<Object>) res.getVal( i );
    extractGroupedInfo( _groupedInfo );
  }
  else if("expanded".equals(n)) {
    NamedList map = (NamedList) res.getVal(i);
    _expandedResults = map.asMap(1);
  }
  else if( "highlighting".equals( n ) ) {
    _highlightingInfo = (NamedList<Object>) res.getVal( i );
    extractHighlightingInfo( _highlightingInfo );
  }
  else if ( "spellcheck".equals( n ) )  {
    _spellInfo = (NamedList<Object>) res.getVal( i );
    extractSpellCheckInfo( _spellInfo );
  }
  else if ("clusters".equals(n)) {
    _clusterInfo = (ArrayList<NamedList<Object>>) res.getVal(i);
    extractClusteringInfo(_clusterInfo);
  }
  else if ( "suggest".equals( n ) )  {
    _suggestInfo = (Map<String,NamedList<Object>>) res.getVal( i );
    extractSuggesterInfo(_suggestInfo);
  }
  else if ( "stats".equals( n ) )  {
    _statsInfo = (NamedList<Object>) res.getVal( i );
    extractStatsInfo( _statsInfo );
  }
  else if ( "terms".equals( n ) ) {
    _termsInfo = (NamedList<NamedList<Object>>) res.getVal( i );
    extractTermsInfo( _termsInfo );
  }
  else if ( "moreLikeThis".equals( n ) ) {
    _moreLikeThisInfo = (NamedList<SolrDocumentList>) res.getVal( i );
  }
  else if ( CursorMarkParams.CURSOR_MARK_NEXT.equals( n ) ) {
    _cursorMarkNext = (String) res.getVal( i );
  }
}
if(_facetInfo != null) extractFacetInfo( _facetInfo );

}

【问题讨论】:

  • 你为什么使用NoOpResponseParser
  • @MatsLindh 好问题。这是我从某处复制的代码。当我切换到 binaryResponseParser 时,它开始工作了。

标签: java exception solr solrj


【解决方案1】:

感谢 MatsLindh 为我指明了正确的方向。 NoOpResponseParser 将响应放入 NamedList 对象中,实际上并不返回 Response 对象。见this for more information on the NoOpResponseParser。 这里有一些 Parser 选项可供使用。它们都扩展了ResponseParser

BinaryResponseParser, DelegationTokenResponse.JsonMapResponseParser, InputStreamResponseParser, NoOpResponseParser, XMLResponseParser

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多