错误不能隐含值ToResponseMarshaller [SearchResponse] [英] Error Could Not Implicit Value ToResponseMarshaller[SearchResponse]

查看:178
本文介绍了错误不能隐含值ToResponseMarshaller [SearchResponse]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

what i want to achieve are : create an API, which looking for into ElasticSearch. my programming language is Scala.

// myRoute.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

//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)

我在寻找谷歌,并创建了
使用scala和spray-routing缺少的DefaultMarshallers

i was looking for at google, and founded DefaultMarshallers missing with scala and spray-routing

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

and then, im follow the instructions :

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()
  }

最后,我收到另一个错误:

finally, i get another error which are :

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

任何想法,怎么处理呢?感谢您的帮助!

any idea, how to deal with that? thanks for your help!

推荐答案

尽管为java类构建RootJsonFormat非常繁琐,这里有一个示例。只需导入范围:

Although building RootJsonFormat for java classes is very tedious, here one example for one result. Just import in scope:

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)
                                           ))))

 }
}

} 

这篇关于错误不能隐含值ToResponseMarshaller [SearchResponse]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆