2016-02-26 17 views
5

Ben Finch ve finagle kullanarak oldukça basit bir dinlenme yöntemi yaptık:Finch: yöntemi için yeterli argümanlar 'toService'

val getUsers:Endpoint[List[User]] = get("users") {Ok(getAllUsers())} 
Http.serve(":8080", getUsers.toService) 

ve bu hata var: üzerinde

Error:(50, 32) not enough arguments for method toService: (implicit ts: io.finch.internal.ToService[List[DAL.Instances.User.User]])com.twitter.finagle.Service[com.twitter.finagle.http.Request,com.twitter.finagle.http.Response]. 
Unspecified value parameter ts. 
    Http.serve(":8080", getUsers.toService) 
          ^

herhangi bir fikir nasıl düzeltilir?

cevap

10

Derleyici hatası, Finch'in en son sürümünde (0.10) biraz daha iyi.

scalaVersion := "2.11.7" 

libraryDependencies += "com.github.finagle" %% "finch-core" % "0.10.0" 

Ve bu kurulumu: biz şu inşa yapılandırma varsa Ardından

import com.twitter.finagle.Http 
import io.finch._ 

case class User(id: String, name: String) 

def getAllUsers(): List[User] = List(User("111", "Foo McBar")) 
val getUsers: Endpoint[List[User]] = get("users") { Ok(getAllUsers()) } 

biz toService kullanmayı deneyin, aşağıdaki olsun:

<console>:18: error: You can only convert a router into a Finagle service if the 
result type of the router is one of the following: 

    * A Response 
    * A value of a type with an EncodeResponse instance 
    * A coproduct made up of some combination of the above 

List[User] does not satisfy the requirement. You may need to provide an 
EncodeResponse instance for List[User] (or for some part of List[User]). 

     Http.serve(":8080", getUsers.toService) 
            ^

sorun olduğunu Finch'e, User türünün örneklerini HTTP yanıtlarına nasıl çevireceğini söylemediniz. Finch'in EncodeResponse, Scala'da (standart kitaplık dahil) yaygın olarak kullanılan polimorfizme ve diğer birçok statik olarak yazılan işlevsel programlama dillerine bir yaklaşım olan bir type class örneğidir.

libraryDependencies ++= Seq(
    "io.circe" %% "circe-generic" % "0.3.0", 
    "com.github.finagle" %% "finch-circe" % "0.10.0" 
) 

Ve sonra gereken tüm aşağıdaki ithalatı ise:

import io.finch.circe._, io.circe.generic.auto._ 

Ve toService

uygun EncodeResponse örneklerini sunmak için en kolay yolu sürüme Finch'in Circe uyumluluk modülü eklemektir sadece iyi çalışır:

scala> Http.serve(":8080", getUsers.toService) 
Feb 26, 2016 8:32:24 AM com.twitter.finagle.Init$$anonfun$1 apply$mcV$sp 
INFO: Finagle version 6.33.0 (rev=21d0ee8b5070b735eda5c84d7aa6fbf1ba7b1635) built at 20160203-202859 
res2: com.twitter.finagle.ListeningServer = Group(/0:0:0:0:0:0:0:0:8080) 
Eğer http://localhost:8080/users giderseniz

Şimdi, şunları görürsünüz:

[{"id":"111","name":"Foo McBar"}] 

Bu sihir gibi görünüyor, ama ne oluyor oldukça ilkeli olduğunu. Circe, derleme zamanında JSON değerleri olarak örnek sınıflarınızı nasıl temsil edeceğinizi anlatan genel kodek türetimi sağlayan bir JSON kitaplığıdır (daha fazla içerik için blogumun here konusuna bakın).

Finch cookbook, bu gibi sorular hakkında daha fazla bilgi edinmek için mükemmel bir kaynaktır ve ilk bölüm, gereksinimlerinin olduğu EncoderResponse örneklerini sağlamanın diğer yolları hakkında ayrıntılı olarak incelenir. Başka sorularınız varsa veya yukarıdakilerden herhangi biri açık değilse, burada veya Gitter numaralı telefondan soru sormaya çekinmeyin.

+0

Teşekkür ederim Travis! –

+0

Çok teşekkür ederim! – NikitaAbrosimov

+0

, io.finch.circe._, io.circe.generic.auto._ dosyasını içe aktardıktan sonra bile, scala ide yöntemi için yeterli argümanlar hakkında şikâyette bulunuyor: _. başka önerileriniz var mı? – Rjk