2015-09-14 6 views
0

Я работаю над воспроизведением 2.3, я хочу обновить коллекцию, вставляя ее в другую коллекцию. Ниже приведен код ошибки.Проблема с несоответствием типа

def create(message : MessageThread) : Future[reactivemongo.core.commands.LastError] = { 
    collectionThread.insert(message.copy(
       createDate = Some(new DateTime()), 
       updateDate = Some(new DateTime()) 
    )) 
} 

def updateMessage(messageId : JsValue) : Future[reactivemongo.core.commands.LastError] = { 
    collection.update(Json.obj("_id" -> (Json.obj("$oid" -> messageId))), 
         Json.obj("$set" -> Json.obj("isRead" -> false, 
           "lastRepliedDate" -> Some(new DateTime())))) 
} 

def createThread = Action.async(parse.json) { request => 
    request.body.validate[MessageThread].flatMap { message => 
      create(message).flatMap { created => 
       updateMessage(request.body \ "messageId").flatMap{ updated => 
        Created 
       } 
     } 
    }.getOrElse(Future.successful(BadRequest("invalid json"))) 
} 

Я вызываю обновление и создаю из createThread. Я не могу отправить результат обратно

Ошибка заключается в следующем

type mismatch; 
found : controllers.Messages.Status 
required: scala.concurrent.Future[?] 

Как я все еще рано с изучением scala. Любая помощь будет оценена.

ответ

1

Я не могу попробовать ваш код, поэтому у меня есть компиляция это на мой взгляд. Тем не менее, мне кажется, проблема здесь:

request.body.validate[MessageThread].flatMap { message => 
    create(message).flatMap { created => 
     updateMessage(request.body \ "messageId").flatMap { updated => 
     Created 
     } 
    } 
} 

Вместо третьего flatMap попробовать map, следующим образом:

request.body.validate[MessageThread].flatMap { message => 
    create(message).flatMap { created => 
     updateMessage(request.body \ "messageId").map { updated => 
     Created 
     } 
    } 
} 

На самом деле, так как это не кажется, что вы используете created и updated вы могли бы просто использовать:

request.body.validate[MessageThread].flatMap { message => 
    create(message).flatMap { _ => 
     updateMessage(request.body \ "messageId").map { _ => 
     Created 
     } 
    } 
} 

При желании вы могли бы использовать эквивалент для понимания:

for { 
    message <- request.body.validate[MessageThread] 
    _ <- create(message) 
    _ <- updateMessage(request.body \ "messageId") 
} yield Created 
+0

Это все еще не работает. Теперь он выбрасывает тип несоответствия; найдено: scala.concurrent.Future [controllers.Messages.Status] требуется: play.api.libs.json.JsResult [?] –

+0

Вам нужно ответить JSON. Я предлагаю вам внимательно ознакомиться с игровым доком, сверху вниз, если у вас нет времени попытаться понять это здесь: https://www.playframework.com/documentation/2.3.x/ScalaJsonHttp – lambdista