2017-09-20 2 views
0

J'ai effectivement un problème lors du retour d'un Seq à l'interface.playframework scala typemismatch lors du renvoi d'un seq

Mon code ressemble à ceci:

def getContentComponentsForProcessSteps: Action[AnyContent] = Action.async { implicit request => 
    println("-----------------------------------------------New Request--------------------------------------------------------") 
    println(request.body.asJson) 
    request.body.asJson.map(_.validate[ProcessStepIds] match { 
     case JsSuccess(steps, _) => 

     val contentComponents: Seq[Future[Seq[Future[ContentComponentModel]]]] = steps.steps.map(stepId => { //foreach 
      // Fetching all ContentComponent Relations 
      contentComponentDTO.getContentComponentsByStepId(stepId).map(contentComponents => { // Future[Seq[ContentComponent_ProcessStepTemplateModel]] 
      // Iteration über die Gefundenen Relations 
      contentComponents.map(contentComponent => { // foreach 
       // Fetch Content Component 
       contentComponentDTO.getContentComponentById(contentComponent.contentComponent_id).flatMap(contentComponent => { // Future[Option[ContentComponentModel]] 
       // Fetch Content Component Data for the types 
       val res = getContentComponentDataforOneContentComponent(contentComponent.get) 
       res.map(con => con) 
       }) 
      }) 
      }) 
     }) 

     Future.sequence(contentComponents).map(eins => { 
      println(eins) 
      Ok(Json.obj("Content Components Return" -> "true", "result" -> eins)) 
     }) 

     case JsError(_) => 
     Future.successful { 
      BadRequest("Can't fetch Content Components") 
     } 
     case _ => Future.successful { 
     BadRequest("Can't fetch Content Components") 
     } 
    }).getOrElse(Future.successful { 
     BadRequest("Can't fetch Content Components") 
    }) 
    } 

erreur est le suivant.

enter image description here

Merci pour tout soupçon

Répondre

4

Regardez le type de eins votre message d'erreur vous dit qu'il est un Seq[Seq[Future[ContenetComponentModel]]] et non pas simplement un Seq comme vous le pensiez.

Il y a deux problèmes avec ceci:

  1. Vous ne pouvez pas écrire un Future (ou dans votre cas, une séquence de contrats à terme) à JSON.
  2. Vous devez avoir une fonction implicite dans la portée pour convertir votre ContenetComponentModel en valeur JSON.

Selon ce que vous voulez que votre résultat à ressembler, vous pouvez essayer aplatir eins puis utiliser un autre Future.sequence, mais je pense que ce que vous devriez vraiment faire est de changer beaucoup de vos .map appels à .flatMap appels à éviter la nidification en premier lieu.