1. 程式人生 > >solr查詢的NoSuchMethodError

solr查詢的NoSuchMethodError

     專案中有一個根據文件內容查詢出文檔的需求,於是開始學習solr。總的流程基本上是這樣:原理學習-solr伺服器搭建-中文分詞配置-新增索引-測試查詢,雖說也經歷了一些波折,但問題總是很快就被解決,一切還算順利。

     於是把solr開始整合進我的專案,結果出現問題:

  

     怎麼回事,此方法JUnit測試都沒有問題,既然測試沒有錯,證明錯誤一定不是部署的solr服務的問題,問題一定出在本地,重新檢查一遍solr查詢的方法,Debug發現問題出現在此句:

     繼續思考:為什麼測試的時候成功了,此方法放進tomcat中就出現問題了,一定是tomcat的原因,於是debug中檢視測試與部署情況下不一樣的地方;別說,還真讓我找到了不同點:

     測試情況下solr查詢引數:

    

     專案中引用solr查詢情況:

    

     專案中使用時,set進SolrQuery物件亂碼!嘿嘿,好開心,問題找到了,一定是專案部署的tomcat字符集問題,檢視tomcat字符集,發現已經設定為UTF-8,咋回事?

     既然tomcat是好的,那我在程式碼中給你進行轉譯:String keywords = ClientUtils.escapeQueryChars(kw),利用此方法將特殊字元進行轉譯後加入solrQuery。測試,還不對,還是NoSuchMethodError。

     是不是我轉譯的不對啊?用JUnit測試類測試一下,沒有報錯,但也沒有查詢到任何東西,返回response為null。看來程式碼轉譯特殊字元後在提交這一個思路有問題,不僅沒專案中solr不對,連測試都查不出東西。

     先刪除掉轉譯的程式碼,Junit測試成功,能夠成功查詢出東西!

     測試的時候轉譯後的URl查不到東西,最多response為null,但也沒報NoSuchMethodError。難道不是因為特殊字元轉譯的問題?進行驗證測試,拿出專案Solr查詢的url用瀏覽器直接查詢:

  

     沒有問題,可以查詢出內容,看來之前的思路錯了,不是這一塊的問題。重新回到問題本身:NoSuchMethodError。找不到這個方法:要麼沒有此方法的所在類,要麼此方法的所在類沒有這個這個方法。測試的時候都可以,說明這個類肯定存在;放進tomat中為什麼不行呢,難道說tomcat中有兩個此類,一個有toQueryString方法,一個沒有此方法,在eclipse中檢視:

 

    果然有兩MapSolrParams類,一個在solr-common-1.3.0 ,一個在solr-solrj-5.5.4,pom檔案中註釋掉一個試一下:

 

     專案更新,測試,成功!

     反思:問題出現的時候,沒有直接從問題的本質出發去思考,反而捨本逐末,一直在找測試情況與專案部署情況的不同,浪費了太多時間。