在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包工具类的修改是如何实现的,在我们平时的工作中,相信也是会起到举一反三的作用。