scala – 找不到参数lgen的隐式值:shapeless.LabelledGeneric.A
发布时间:2020-12-16 18:31:22 所属栏目:安全 来源:网络整理
导读:我是Shapeless的新手.我有一个帮助类,它利用无形的“自动类型类派生”( https://gist.github.com/negator/fbbcd1b2ce9a85b762b7)来帮助我填充json的读写. import play.api.libs._import json._import shapeless.{ `::` = :#:,_ }import poly._object SReads
我是Shapeless的新手.我有一个帮助类,它利用无形的“自动类型类派生”(
https://gist.github.com/negator/fbbcd1b2ce9a85b762b7)来帮助我填充json的读写.
import play.api.libs._ import json._ import shapeless.{ `::` => :#:,_ } import poly._ object SReads extends LabelledTypeClassCompanion[Reads] { object typeClass extends LabelledTypeClass[Reads] { def emptyProduct: Reads[HNil] = Reads(_ => JsSuccess(HNil)) def product[F,T <: HList](name: String,FHead: Reads[F],FTail: Reads[T]) = Reads[F :#: T] { case obj @ JsObject(fields) => for { head <- FHead.reads(obj name) tail <- FTail.reads(obj - name) } yield head :: tail case _ => JsError("Json object required") } def project[F,G](instance: => Reads[G],to: F => G,from: G => F) = Reads[F](instance.map(from).reads) def emptyCoproduct: Reads[CNil] = Reads[CNil](_ => JsError("CNil object not available")) def coproduct[L,R <: Coproduct]( name: String,cl: => Reads[L],cr: => Reads[R]) = Reads[L :+: R]{ js => js match { case js @ JsString(n) if n == name => cl.reads(js).map(Inl.apply) case js @ _ => cr.reads(js).map(Inr.apply) } } } } 这就是我使用它的方式: case class TrialMember( @Key("_id") var id: String,var weeks: String,var `type`: Option[String] = Some("email"),var updatedDate: Date = DateTime.now.toDate ) object TrialMemberDao extends ModelCompanion[TrialMember,String] { def collection = mongoCollection("trial_member") val dao = new SalatDAO[TrialMember,String](collection) {} def emails() = dao.find(MongoDBObject("type" -> "email")).toList.map(_.id) def domains() = dao.find(MongoDBObject("type" -> "domain")).toList.map(_.id) def isTrialMember(userEmail: String): Boolean = { val trialMembers = emails() // whitelisted emails val trialDomains = domains() // whitelisted domains trialMembers.contains(userEmail) || trialDomains.filter(userEmail.contains(_)).headOption.isDefined } } object TrialMember { implicit val jsonWrites: Writes[TrialMember] = SWrites.deriveInstance implicit val jsonReads: Reads[TrialMember] = SReads.deriveInstance } 但升级到sbt 0.13.8和Play 2.4之后,现在它给了我这个错误: could not find implicit value for parameter lgen: shapeless.LabelledGeneric.Aux[T,LKV] [error] implicit val reads: Reads[TrialMember] = SReads.deriveInstance 解决方法
麻烦有点搞笑,你的类型类派生完美实现,而编译器找不到应该用于类型字段的Option [String]的Reads实例.只需为您的代码提供以下定义:
object optionFormats { def noneReads[T]: Reads[Option[T]] = Reads(Function.const(JsSuccess(None))) implicit def optFormat[T](implicit w: Writes[T],r: Reads[T]) = Format[Option[T]]( r.map[Option[T]](Some(_)).orElse(noneReads),Writes(_.fold[JsValue](JsNull)(w.writes))) } 然后在任何代码中 import optionFormats._ 你的实例应该按照需要构建. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |