私はいくつかのアプリケーション用の小さな登録モジュールを書いており、これを型クラスで行っています。主なロジックはスプレー ルーティングに基づいています。
val api = post {
path("register" / Rest) { rest =>
rest match {
case "user" => register[User]
// ... other cases
}
}
}
}
簡単にするために、ユーザーには次のデータ型があります。
case class User(id: String, email: String)
POST リクエストからエンティティを抽出するには、typeclass を使用しています:
trait EntityExtractor[T] {
def extractFromRequest: Directive[T :: String :: HNil]
}
ユーザーの実装:
object User {
implicit val extractor = new EntityExtractor[User] {
def extractFromRequest: Directive[User :: String :: HNil] =
formFields('email, 'pass).hmap {
case email :: pass :: HNil =>
val id = UID.genId
User(id, email) :: pass :: HNil
}
}
}
typeclass ディレクティブを使用する register メソッドで問題が発生します。
def register[T] =
extractEntity[T].apply { entity => // fails here
validateEntity(entity) {
completeRegistration(entity)
}
}
}
def extractEntity[T: EntityExtractor]: Directive[Entity[T] :: HNil] = {
implicitly[EntityExtractor[T]].extractFromRequest.hmap {
case entity :: pass :: HNil => Entity(entity, pass) :: HNil
}
}
そして、例外で失敗します: could not find implicit value for evidence parameter of type EntityExtractor[T]
.
パターン マッチングなしでリフレクション (TypeTags または Manifest) でこれを修正する方法はありますか?