У меня возникли проблемы с выяснением, почему компилятор жалуется на то, что не найдет неявный параметр для чтения, потому что я почти уверен, что он находится в области. Ошибка заключается в следующем:Неявные параметры не найдены
Ошибка: (13, 18) Нет дескриптора Json для типа Config. Попробуйте реализовать неявные чтения или форматирование для этого типа. test.validate [Config] .map { ^
Ошибка: (13, 18) не достаточно аргументов для метода Validate: (неявные выстр: play.api.libs.json.Reads [Config]) play.api .libs.json.JsResult [wings.m2m.conf.model.Config]. Необязательный параметр параметра rds. test.validate [Config] .map { ^
, и это происходит в следующем коде:
import play.api.libs.json._
import play.api.libs.json.Reads._
import Config.JsonImplicits._
import scala.util.Try
object Test {
def main(args: Array[String]) {
val test = Json.obj("action" -> Config.Action.nameAcquisitionRequest.toString, "value" -> "hola")
test.validate[Config].map {
t => println(t)
t
}
}
}
/**
* Config companion object
*/
object Config {
type ValueType = String
val ActionKey = "action"
val ValueKey = "value"
object Action extends Enumeration {
type Action = Value
val nameAcquisitionRequest = Value("nameAcquisitionRequest")
val nameAcquisitionReject = Value("nameAcquisitionReject")
val nameAcquisitionAck = Value("nameAcquisitionAck")
val broadcast = Value("broadcast")
}
/**
* Json implicit conversions
*/
object JsonImplicits {
implicit object ConfigReads extends Reads[Config] {
def hTypeCast(action: Config.Action.Value, value: Config.ValueType): Config = {
action match {
case Config.Action.nameAcquisitionRequest => NameAcquisitionRequest(value)
case Config.Action.nameAcquisitionReject => NameAcquisitionReject(value)
case Config.Action.nameAcquisitionAck => NameAcquisitionAck(value)
}
}
override def reads(json: JsValue): JsResult[Config] = json match {
case json: JsObject =>
val action = (json \ ActionKey).as[String]
Try(Config.Action.withName(action)) map {
a =>
val value = (json \ ValueKey).as[String]
JsSuccess(hTypeCast(a, value))
} getOrElse (JsError("Can't convert to Config"))
case _ => JsError("Can't convert to Config")
}
}
implicit object ConfigWrites extends OWrites[Config] {
def jsObjectCreator(action: Config.Action.Value, value: Config.ValueType): JsObject = {
Json.obj(ActionKey -> action.toString, ValueKey -> Json.toJson(value))
}
override def writes(o: Config): JsObject = o match {
case c: NameAcquisitionRequest => jsObjectCreator(Config.Action.nameAcquisitionRequest, c.value)
case c: NameAcquisitionReject => jsObjectCreator(Config.Action.nameAcquisitionReject, c.value)
case c: NameAcquisitionAck => jsObjectCreator(Config.Action.nameAcquisitionAck, c.value)
}
}
}
}
sealed trait Config {
val value: Config.ValueType
}
/**
* Intermediate config message
* @param value
*/
case class NameAcquisitionRequest(override val value: String)
extends Config
case class NameAcquisitionReject(override val value: String)
extends Config
case class NameAcquisitionAck(override val value: String)
extends Config
case class Broadcast(override val value: String)
extends Config
ошибка возникает при выполнении основного метода объекта испытаний. Чтобы этот пример работал, убедитесь, что в SBT добавлена следующая зависимость: «com.typesafe.play» %% «play-json»% «2.4.1». И я не уверен, но, возможно, этот резольвер нужен: resolvers + = «Typesafe Repo» в «http://repo.typesafe.com/typesafe/releases/»
проблема заключается в том, что функция «Validate» имеет неявную считывает параметр, и если вы посмотрите на моем импорте, я импортировать Config.JsonImplicits._ -> так что я везу неявные читает объем. Ваше решение работает отлично, даже без параметра параметризации [Config], но мой вопрос: почему компилятор продолжает говорить, что ему нужны неявные чтения для Config, если он уже импортирован? – vicaba
Мне тоже было интересно .. –
Он продолжает жаловаться, даже если оператор импорта находится только на предыдущей строке ... – vicaba