【问题标题】:Error Could Not Implicit Value ToResponseMarshaller[SearchResponse]错误不能隐含值 ToResponseMarshaller[SearchResponse]
【发布时间】:2023-03-14 09:50:02
【问题描述】:

我想要实现的是:创建一个 API,它在 ElasticSearch 中寻找。我的编程语言是 Scala。

//myRoute.scala

val pencarianES =
  {
    post
    {
      path("cariES")
      {
        parameters("xQuery", "xNilai")
        {
          (yQuery, yNilai) =>
            val PR = new ProsesRekomendasi
            respondWithMediaType(MediaTypes.`application/json`)
            {
              complete
              {
                PR.ambilDariES(yQuery, yNilai)
              }
            }
        }
      }
    }
  }

//prosesRekomendasi.scala

class ProsesRekomendasi
{
  val ESM = new ESManager
  val CLT = ESM.client

  def ambilDariES(pQuery:String, pNilai:String) =
  {
    CLT.prepareSearch("app_lr_portal_01")
      .setTypes("lr01")
      .setQuery(QueryBuilders.termQuery(s"$pQuery",s"$pNilai"))
      .execute()
      .actionGet()
  }
}

错误是:

could not find implicit value for parameter marshaller:
spray.httpx.marshalling.ToResponseMarshaller[org.eleasticsearch.action.search.SearchResponse]
PR.ambilDariES(yQuery, yNilai)

我在谷歌寻找,并创立了 DefaultMarshallers missing with scala and spray-routing

然后,我按照说明进行操作:

def ambilDariES(pQuery:String, pNilai:String)(implicit ec:ExecutionContext) =
  {
    CLT.prepareSearch("app_lr_portal_01")
      .setTypes("lr01")
      .setQuery(QueryBuilders.termQuery(s"$pQuery",s"$pNilai"))
      .execute()
      .actionGet()
  }

最后,我得到另一个错误是:

Cannot find an implicit ExecutionContext, either import scala.concurrent.ExecutionContext.Implicits.global or use a custom one
                PR.ambilDariES(yQuery, yNilai)

任何想法,如何处理?感谢您的帮助!

【问题讨论】:

  • 首先,我建议您在代码示例中使用英语,因为这样可以减轻阅读您代码的人的认知负担。对于第一个错误 - spray 不知道如何编组 SearchResponse,如果 ElasticSearch API 不提供编组器,则需要显式提供编组器。该文档应该让您对后续步骤有所了解:spray.io/documentation/1.2.2/spray-httpx/marshalling 对于您的最后一个错误 - 您是否尝试按照它的要求执行?
  • 好的,请原谅我@Tim。是的,我做到了。呵呵
  • @Tim 先生,我遇到了类似 SunBright 的问题。有什么想法吗?

标签: json scala elasticsearch akka


【解决方案1】:

虽然为 java 类构建 RootJsonFormat 非常繁琐,这里举一个例子说明一个结果。只需在范围内导入:

object SearchResultProtocol {

   implicit object SearchResulJsonFormatObject extends  RootJsonFormat[SearchResponse] {
     def read(e: JsValue) = null


/* {
 "_shards":{
    "total" : 5,
    "successful" : 5,
    "failed" : 0
 },
"hits":{
    "total" : 1,
    "hits" : [
        {
            "_index" : "twitter",
            "_type" : "tweet",
            "_id" : "1",
            "_source" : {
                "user" : "kimchy",
                "postDate" : "2009-11-15T14:12:12",
                "message" : "trying out Elasticsearch"
            }
        }
    ]
}
}*/

 private def getHits(arr: Array[SearchHit]) : JsArray = { 
   JsArray(arr.map { x => marshallHit(x) }.toVector)
 }  


 private def marshallHit(hit: SearchHit) : JsValue = {
   JsObject(Map("_index" -> JsString(hit.index()),
                "_type" -> JsString(hit.getType),
                "_id" -> JsString(hit.getId),
                "source" -> JsString(hit.getSourceAsString)))
 }

 def write(sr: SearchResponse) = {
   JsObject(Map("_shards" -> 
               JsObject(Map("total" -> JsNumber(sr.totalShards()),
                            "successful" -> JsNumber(sr.getSuccessfulShards()),
                            "failed" -> JsNumber(sr.getFailedShards()))),
                 "hits" -> JsObject(Map("total" -> JsNumber(sr.getHits.totalHits()),
                                         "" -> getHits(sr.getHits.getHits)
                                           ))))

 }
}

} 

【讨论】:

  • 你好@EmiCareOfCell44,我遇到了像 SunBright 这样的问题。必须在哪里,我把代码和你的答案一样?谢谢!
  • 是的,只要导入 SearchResultProtocol._ 编译器就会找到序列化器。
  • 在哪里可以找到 SearchResultProtocol._ ? @EmiCareOfCell44
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-16
  • 2015-11-25
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
相关资源
最近更新 更多