记录一次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会被解析成"_"
网上好像没什么解决办法, 这个就先过一段时间再来解决。有知道的朋友希望不吝赐教!
欢迎指正,共同进步!
原文地址:https://www.cnblogs.com/MarchApril/p/10660363.html