2015-11-23 1 views
2

Я начинаю играть с Play! Рамки для Scala и попытки создать API-интерфейс JSON REST с помощью MongoDB.Нет сериализатора Json для типа scala.concurrent.Future [Список [models.Product]]

Я использую play-mongodb-driver и пытаюсь построить метод findAll для моего API.

Так у меня есть эта модель:

//models/product.scala                                  
case class Product(_id: String, name: String, price: Double)                   

object Product {                              
    val collection = MongoClients.create().database("shopping").collection("products")             
    implicit val format = Json.format[Product]  

    def findAll = {                              
    collection.find().collect[Product]                         
    } 
} 

И этот контроллер:

//controllers/Product.scala 

class Products @Inject()(mongo: MongoClient) extends Controller {                  

    import models._                              

    def listProducts = Action.async {                        
    Json.toJson(Product.findAll)                          
    }                                                                   
}   

и все, что я получил это сообщение об ошибке:

No Json serializer found for type scala.concurrent.Future[List[models.Product]]. Try to implement an implicit Writes or Format for this type. 

Как я могу сделать это работает?

Я видел в некоторых примерах людей, реализующих implicti val format = Json.format[Model] и думал, что это могло бы решить эту проблему, но это не так ...

+2

Выглядит как Product.findAl l возвращает Future, поэтому попробуйте Product.findAll.map {allProducts => Json.toJson (allProducts)} –

+0

Решенная часть проблемы! Но теперь он говорит, что перегруженный метод «применить» не может быть применен – gbrennon

+0

hmm как насчет Ok (Json.toJson (allProducts)) –

ответ

0

Я не понимаю, что это метод Product.findAll, но это выглядит как этот метод возвращает

Future[List[Product]] 

проблема заключается в том, что вы пытаетесь сериализации будущее JSON, но вы должны сериализовать результат будущего, как это:

def listProducts = Action.async { 
    Product 
    .findAll 
    .map(Json.arr(_)) 
    .map(arr => Ok(arr(0))) 
} 
+0

не работает :(Теперь у меня есть это «Невозможно написать экземпляр play.api.libs.json.JsLookupResult для ответа HTTP. Попробуйте определить запись [play.api.libs.json.JsLookupResult]» – gbrennon

+0

@gbrennon Это работает для меня без ".map (Json.arr (_))". – Majki

Смежные вопросы