elastic4s 6.2.2 HttpClient迁移报错:HttpExecutable隐式值缺失求助
兄弟,我来给你捋清楚这个问题哈!
首先说HttpExecutable是什么:它其实是elastic4s HttpClient模块里的核心“桥梁”类型——简单讲,就是负责把你写的Elasticsearch操作(比如你用的IndexDefinition插入定义)转换成能发给ES的HTTP请求,还能把ES返回的结果转换成你能直接用的对象。它是个隐式参数,所以编译器必须能找到对应的隐式实例,你的插入操作才能正常编译执行。
你遇到的编译错误,本质就是编译器在当前作用域里找不到对应IndexDefinition的HttpExecutable隐式实例。在6.2.2版本的elastic4s里,迁移到HttpClient时,得注意这几个点来解决:
第一步:导入正确的隐式和DSL支持
一定要导入com.sksamuel.elastic4s.http.ElasticDsl._,这个包不仅包含了构建ES操作的DSL语法,还自带了大部分常用操作(比如插入、查询)对应的HttpExecutable隐式实例,是核心的导入项。第二步:正确初始化HttpClient实例
你得先创建一个有效的HttpClient客户端,它会携带执行操作所需的上下文和隐式依赖。示例代码如下:import com.sksamuel.elastic4s.http.HttpClient import org.apache.http.HttpHost import org.elasticsearch.client.RestClient // 先构建ES的RestClient基础实例 val restClient = RestClient.builder(new HttpHost("localhost", 9200, "http")).build() // 基于RestClient创建elastic4s的HttpClient val client = HttpClient.fromRestClient(restClient)这里的
client就是你后续执行所有ES操作的入口。第三步:通过client执行操作
当你写好插入的请求定义后,必须通过client.execute()方法来执行,这样client会自动提供所需的HttpExecutable隐式实例。比如:import com.sksamuel.elastic4s.http.ElasticDsl._ // 构建插入请求 val insertReq = indexInto("your_index" / "your_type").fields("key" -> "value", "another_key" -> 123) // 执行请求(这里用await是同步获取结果,也可以用异步回调) val result = client.execute(insertReq).await
另外还要注意,你的项目依赖里必须包含elastic4s的http模块和对应的ES rest客户端包,比如在sbt里要加这些依赖:
libraryDependencies += "com.sksamuel.elastic4s" %% "elastic4s-http" % "6.2.2" libraryDependencies += "org.elasticsearch.client" % "elasticsearch-rest-client" % "6.2.2"
内容的提问来源于stack exchange,提问作者Alex

