項目中有一個根據文檔內容查詢出文檔的需求,因而開始學習solr。總的流程基本上是這樣:原理學習-solr服務器搭建-中文分詞配置-添加索引-測試查詢,雖然說也經歷了一些波折,但問題老是很快就被解決,一切還算順利。瀏覽器
因而把solr開始集成進個人項目,結果出現問題:tomcat
怎麼回事,此方法JUnit測試都沒有問題,既然測試沒有錯,證實錯誤必定不是部署的solr服務的問題,問題必定出在本地,從新檢查一遍solr查詢的方法,Debug發現問題出如今此句:服務器
繼續思考:爲何測試的時候成功了,此方法放進tomcat中就出現問題了,必定是tomcat的緣由,因而debug中查看測試與部署狀況下不同的地方;別說,還真讓我找到了不一樣點:eclipse
測試狀況下solr查詢參數:學習
項目中引用solr查詢狀況:測試
項目中使用時,set進SolrQuery對象亂碼!嘿嘿,好開心,問題找到了,必定是項目部署的tomcat字符集問題,查看tomcat字符集,發現已經設置爲UTF-8,咋回事?url
既然tomcat是好的,那我在代碼中給你進行轉譯:String keywords = ClientUtils.escapeQueryChars(kw),利用此方法將特殊字符進行轉譯後加入solrQuery。測試,還不對,仍是NoSuchMethodError。spa
是否是我轉譯的不對啊?用JUnit測試類測試一下,沒有報錯,但也沒有查詢到任何東西,返回response爲null。看來代碼轉譯特殊字符後在提交這一個思路有問題,不只沒項目中solr不對,連測試都查不出東西。debug
先刪除掉轉譯的代碼,Junit測試成功,可以成功查詢出東西!對象
測試的時候轉譯後的URl查不到東西,最多response爲null,但也沒報NoSuchMethodError。難道不是由於特殊字符轉譯的問題?進行驗證測試,拿出項目Solr查詢的url用瀏覽器直接查詢:
沒有問題,能夠查詢出內容,看來以前的思路錯了,不是這一塊的問題。從新回到問題自己:NoSuchMethodError。找不到這個方法:要麼沒有此方法的所在類,要麼此方法的所在類沒有這個這個方法。測試的時候均可以,說明這個類確定存在;放進tomat中爲何不行呢,難道說tomcat中有兩個此類,一個有toQueryString方法,一個沒有此方法,在eclipse中查看:
果真有兩MapSolrParams類,一個在solr-common-1.3.0 ,一個在solr-solrj-5.5.4,pom文件中註釋掉一個試一下:
項目更新,測試,成功!
反思:問題出現的時候,沒有直接從問題的本質出發去思考,反而捨本逐末,一直在找測試狀況與項目部署狀況的不一樣,浪費了太多時間。