2015-09-25 2 views
3

У меня возникли проблемы с выяснением, почему компилятор жалуется на то, что не найдет неявный параметр для чтения, потому что я почти уверен, что он находится в области. Ошибка заключается в следующем:Неявные параметры не найдены

Ошибка: (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/»

ответ

0

Я не уверен, чего вы пытаетесь достичь, и решает ли это вашу проблему, но здесь вы идете:

test.validate[Config](Config.JsonImplicits.ConfigReads).map { 
    t => println(t) 
    t 
} 
+0

проблема заключается в том, что функция «Validate» имеет неявную считывает параметр, и если вы посмотрите на моем импорте, я импортировать Config.JsonImplicits._ -> так что я везу неявные читает объем. Ваше решение работает отлично, даже без параметра параметризации [Config], но мой вопрос: почему компилятор продолжает говорить, что ему нужны неявные чтения для Config, если он уже импортирован? – vicaba

+0

Мне тоже было интересно .. –

+0

Он продолжает жаловаться, даже если оператор импорта находится только на предыдущей строке ... – vicaba