記錄一次Spring Data Solr相關的錯誤解決
生活本不易,流人遂自安
相信大家也使用過SpringDataSolr,但是在最新版的SpringDataSolr 4.0.5 RELEASE中有些方法已經和以前的版本有些大不一樣了。本次主要表達的是分組查詢的不同。
問題描述
以前的分組查詢是這樣的:
- 創建分組對象,並設置查詢條件
- 構建分組選項並且設置分組選項
- 獲取分組頁
- 獲取分組結果對象
- 獲取分組入口也groupEntries
- 從入口頁中獲取入口集合getContent
如果你按照這種設置的話,那么你會發現有如下錯誤:java.lang.IllegalArgumentException: Pageable must not be null!
錯誤描述的頁很清晰,就是Pageable不能為空。但是改如何去解決呢,博主開始也是baidu、Google了一波,但是發現網上的相關問題實在是太少了,沒有什么有價值的,最后只能自己去跟蹤錯誤然后尋找了。
問題的跟蹤與解決
首先在相應的地方打上斷點,錯誤往下會找到出錯的行數,就是在 solrTemplate.queryForGroupPage這個方法上報的錯。打上斷點進去查看。既然是Pageable的問題,那么肯定是跟page有關,留心!前面的邏輯主要是去創建page,途中查看Debugger可以看到response已經獲得了,在doQueryForPage的時候已經從solr當中查詢到了並返回數據,查看值也是自己預期的值,那么說明並不是solr那邊的錯誤。繼續,當走到createSolrResultPage方法時,走完一遍過程便會發現錯誤在哪里
主要是創建page對象的時候設置setGroupResults出錯,繼續跟進去convertGroupQueryResponseToGroupResultMap這個方法,這個方法應該是對返回的response值封裝成Map。此方法前面是將返回的response值進行循環設值之類的,一般沒有問題。
看到設置page值的時候了,跟進去看看。第二個參數是獲取返回的request的方法。
進去可以看到是GroupOptions的class,也就是我們前面設置分組選項的類,此處的方法是判斷limit和offset是否為空,這個相信在MySQL中的分組查詢中很熟悉了,但是我們沒有設置過limit和offset的值,此處肯定返回null。這就有問題了,返回到上一個new PageImpl的時候,點進去方法查看構造函數
注意前面傳進來的第二個參數為null,此處掉用父類構造函數,繼續點進去查看
可以看到此處就是錯誤發生的地點了,知道了錯誤所在就好辦了。此處的null值我們前面看到是在GroupOptions的class中判斷的,由此可以推斷是GroupOptions沒有設置limit和offset的值導致的。返回到前面設置的地方去groupOptions.setXXX這兩個值,發現是可以設置值的,設置上繼續跑起來,發現沒有問題了!
另外需要注意的問題
- 最新的SpringDataSolr的一些方法參數好像也是有了變化的。redisTemplate.boundHashOps("value").get(template);這個方法的get參數需要是String的值,如果是Long類型的值,會發生類型轉化的異常。
- 還有Solr高版本[7.x.x版本之后都不行了,前面的版本就不清楚了]開始動態字段的設置好像是不支持中文了
這樣設置動態字段,如果Map的key是中文的話,存入Solr會被解析成"_"
網上好像沒什么解決辦法, 這個就先過一段時間再來解決。有知道的朋友希望不吝賜教!
歡迎指正,共同進步!