在springboot项目中,由于整合elasticsearch选择的:

<dependency>
    <groupId>com.github.vanroy</groupId>
    <artifactId>spring-boot-starter-data-jest</artifactId>
</dependency>
version=6.3.1
groupId=io.searchbox
artifactId=jest-common

依赖,所以在查询结果的时候,会 出现如下报错:

java.lang.UnsupportedOperationException: JsonObject

    at com.google.gson.JsonElement.getAsLong(JsonElement.java:218)
    at io.searchbox.core.SearchResult.getTotal(SearchResult.java:218)
    at com.github.vanroy.springdata.jest.mapper.DefaultJestResultsMapper.mapResults(DefaultJestResultsMapper.java:122)
    at com.github.vanroy.springdata.jest.JestElasticsearchTemplate.queryForPage(JestElasticsearchTemplate.java:415)
    at com.github.vanroy.springdata.jest.JestElasticsearchTemplate.queryForPage(JestElasticsearchTemplate.java:405)

依旧是百度无果,所以还是只能靠自己看源码解决错误,通过debugger调试,找到出错的最终代码,并定位了其所在类:io.searchbox.core.SearchResult,及其方法:

 

可见,导致出错的最终代码便是

total = obj.getAsLong();

那么,我们进去getAsLong方法去一探究竟:

奇怪,这个类的原生方法本来就不支持这个方法,那么该如何解决呢?

标题我们说到,这个springcloud框架是基于JHipster来做的开发,那么我们看框架原生是怎么做的呢?

通过查看源码,在其他的工程中找到了原因:

由上图可知,框架重写了一个和上文一样的全限定类名的方法,那么它的作用是什么呢?

通过比对,发现在上文中出错的方法被框架重写了:

也就是最重要的这一段:

total = obj.getAsJsonObject().get("value").getAsLong();

 通过这次重写,就解决了es查询报错的问题。

从上面的思路,其实我们可以看出,对引用jar包工具类的修改是如何实现的,在我们平时的工作中,相信也是会起到举一反三的作用。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐