2015-11-06 8 views
2

Моей поддержки спрей JSon выглядит такАкка-клиент: не удалось найти неявное значение для параметра немаршалинга

object MarshallingSupport extends SprayJsonSupport { 
    implicit def json4sFormats: Formats = DefaultFormats 
} 

И в моем пути, я хочу, чтобы отобразить запрос на DTO

object Main extends App with AppConfig with BaseService with MainActorSystem { 

    val processor = system.actorOf(Props(), "processorActor") 
    val view = system.actorOf(Props(), "processorActor") 

    override protected implicit val executor: ExecutionContext = system.dispatcher 
    override protected val log: LoggingAdapter = Logging(system, getClass) 
    override protected implicit val materializer: ActorMaterializer = ActorMaterializer() 

    Http().bindAndHandle(routes(processor, view), httpInterface, httpPort) 
} 

trait BaseServiceRoute { 
    protected implicit def executor: ExecutionContext 
    protected implicit def materializer: ActorMaterializer 
    protected def log: LoggingAdapter 
} 

trait MainActorSystem { 
    implicit val system = ActorSystem("booking") 
} 

final case class CalculatePriceForRangeDto(unitId: Int, from: Long, to: Long) 

trait PriceServiceRoute extends BaseServiceRoute { 

    implicit val timeout = Timeout(30 seconds) 

    import com.example.crudapi.utils.MarshallingSupport._ 

    def customersRoute(command: ActorRef, query: ActorRef) = pathPrefix("price") { 
    post { 
     path("calculate") { 
     decodeRequest { 
      entity(as[CalculatePriceForRangeDto]) { 
      priceForRange => onComplete((query ? CalculatePriceForRange(

но Я получаю

Error:(32, 20) could not find implicit value for parameter um: akka.http.scaladsl.unmarshalling.FromRequestUnmarshaller[com.example.crudapi.http.routes.CalculatePriceForRangeDto] 
     entity(as[CalculatePriceForRangeDto]) { 
      ^

Увидели все связанные с этим вопросы, но ничего не решили мою проблему. Странная часть заключается в том, что я попробовал шаблон Typesafe akka-dddd-cqrs, и он работает, тот же код.

Я пропустил что-то с неявным контекстом? Любые идеи о том, что это может быть?

ответ

3

SprayJsonSupport работает с распылителем-json (не с json4s). Таким образом, вы должны определенных marshallers следующего

trait JsonMarshallers extends DefaultJsonProtocol { 
    implicit val DigestItemWireFormat = jsonFormat6(DigestItemWire.apply) 

    implicit val LocalDateTimeFormat = new JsonFormat[LocalDateTime] { 

    private val iso_date_time = DateTimeFormatter.ISO_DATE_TIME 

    def write(x: LocalDateTime) = JsString(iso_date_time.format(x)) 

    def read(value: JsValue) = value match { 
     case JsString(x) => LocalDateTime.parse(x, iso_date_time) 
     case x => throw new RuntimeException(s"Unexpected type %s on parsing of LocalDateTime type".format(x.getClass.getName)) 
    } 
    } 
} 

, а затем импортировать JsonMarshallers._ в области, где вы их использовать или смешивать его с PriceServiceRoute и импортировать akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ в начале файла.

+0

какой класс DigestItemWire? Не иметь его в области. – Reeebuuk

+0

@Reeebuuk Это просто пример класса case, который вы хотите сериализовать/десериализовать как 'CalculatePriceForRangeDto' в вашем случае. – expert

+0

пробовал это, но я получаю сообщение об ошибке: type mismatch; найдено: (Int, Long, Long) => com.example.crudapi.http.routes.CalculatePriceForRangeDto требуется: (?,?,?,?,?,?) =>? Примечание: неявное значение CalculatePriceForRangeDtoFormat не применяется здесь, потому что идет после точки приложения и ему не хватает явного типа результата неявное вал CalculatePriceForRangeDtoFormat = jsonFormat6 (CalculatePriceForRangeDto.apply) – Reeebuuk