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檔案中註釋掉一個試一下:
專案更新,測試,成功!
反思:問題出現的時候,沒有直接從問題的本質出發去思考,反而捨本逐末,一直在找測試情況與專案部署情況的不同,浪費了太多時間。