记录一次Spring Data Solr相关的错误解决

记录一次Spring Data Solr相关的错误解决

生活本不易,流人遂自安

相信大家也使用过SpringDataSolr,但是在最新版的SpringDataSolr 4.0.5 RELEASE中有些方法已经和以前的版本有些大不一样了。本次主要表达的是分组查询的不同。

问题描述

以前的分组查询是这样的:

  1. 创建分组对象,并设置查询条件
  2. 构建分组选项并且设置分组选项
  3. 获取分组页
  4. 获取分组结果对象
  5. 获取分组入口也groupEntries
  6. 从入口页中获取入口集合getContent

记录一次Spring Data Solr相关的错误解决_第1张图片

如果你按照这种设置的话,那么你会发现有如下错误:java.lang.IllegalArgumentException: Pageable must not be null!

记录一次Spring Data Solr相关的错误解决_第2张图片

错误描述的页很清晰,就是Pageable不能为空。但是改如何去解决呢,博主开始也是baidu、Google了一波,但是发现网上的相关问题实在是太少了,没有什么有价值的,最后只能自己去跟踪错误然后寻找了。

问题的跟踪与解决

首先在相应的地方打上断点,错误往下会找到出错的行数,就是在 solrTemplate.queryForGroupPage这个方法上报的错。打上断点进去查看。**既然是Pageable的问题,那么肯定是跟page有关,留心!**前面的逻辑主要是去创建page,途中查看Debugger可以看到response已经获得了,在doQueryForPage的时候已经从solr当中查询到了并返回数据,查看值也是自己预期的值,那么说明并不是solr那边的错误。继续,当走到createSolrResultPage方法时,走完一遍过程便会发现错误在哪里

记录一次Spring Data Solr相关的错误解决_第3张图片

主要是创建page对象的时候设置setGroupResults出错,继续跟进去convertGroupQueryResponseToGroupResultMap这个方法,这个方法应该是对返回的response值封装成Map。此方法前面是将返回的response值进行循环设值之类的,一般没有问题。

记录一次Spring Data Solr相关的错误解决_第4张图片

看到设置page值的时候了,跟进去看看。第二个参数是获取返回的request的方法。

记录一次Spring Data Solr相关的错误解决_第5张图片

进去可以看到是GroupOptions的class,也就是我们前面设置分组选项的类,此处的方法是判断limit和offset是否为空,这个相信在MySQL中的分组查询中很熟悉了,但是我们没有设置过limit和offset的值,此处肯定返回null。这就有问题了,返回到上一个new PageImpl的时候,点进去方法查看构造函数

记录一次Spring Data Solr相关的错误解决_第6张图片

注意前面传进来的第二个参数为null,此处掉用父类构造函数,继续点进去查看

记录一次Spring Data Solr相关的错误解决_第7张图片

可以看到此处就是错误发生的地点了,知道了错误所在就好办了。此处的null值我们前面看到是在GroupOptions的class中判断的,由此可以推断是GroupOptions没有设置limit和offset的值导致的。返回到前面设置的地方去groupOptions.setXXX这两个值,发现是可以设置值的,设置上继续跑起来,发现没有问题了!

另外需要注意的问题

  1. 最新的SpringDataSolr的一些方法参数好像也是有了变化的。redisTemplate.boundHashOps(“value”).get(template);这个方法的get参数需要是String的值,如果是Long类型的值,会发生类型转化的异常。
  2. 还有Solr高版本[7.x.x版本之后都不行了,前面的版本就不清楚了]开始动态字段的设置好像是不支持中文了

记录一次Spring Data Solr相关的错误解决_第8张图片

这样设置动态字段,如果Map的key是中文的话,存入Solr会被解析成"_"

记录一次Spring Data Solr相关的错误解决_第9张图片

网上好像没什么解决办法, 这个就先过一段时间再来解决。有知道的朋友希望不吝赐教!


欢迎指正,共同进步!

你可能感兴趣的:(JavaWeb)