0

Я хочу создать общие модели результатов для RawCommand с использованием реактивного монго с игровым фреймворком. Но у меня ошибка. Ниже приведена общая структура классов классов.Play ReactiveMongo: нужно создать общий класс результатов для RawCommand с помощью ReactiveMongo

case class DistinctRawCommandResult[T] (

val values: List[T], 
val stats: CommandStatus, 
val ok: Double 
) 

case class CommandStatus(

val n: Int, 
val nscanned: Int, 
val nscannedObjects: Int, 
val timems: Int, 
val cursor: String 
) 

object DistinctRawCommandResultBsonFormatter { 

implicit val commandStatusReader: BSONDocumentReader[CommandStatus] = Macros.reader[CommandStatus]; 
implicit val distinctRawCommandReader: BSONDocumentReader[DistinctRawCommandResult[T]] = Macros.reader[DistinctRawCommandResult[T]]; 
} 

В строке implicit val distinctRawCommandReader: BSONDocumentReader[DistinctRawCommandResult[T]] = Macros.reader[DistinctRawCommandResult[T]] генерируется ошибка: ◾not found: type T, потому что DistinctRawCommandResult принимает параметр. Но когда я использую object DistinctRawCommandResultBsonFormatter[T], это также порождает ошибку.

Как создать общую модель результатов для RawCommand.

+0

В следующем выпуске будет предоставлена ​​отдельная команда. Между тем вы можете закодировать код от мастера: https://github.com/ReactiveMongo/ReactiveMongo/pull/411 – cchantep

ответ

0

Прежде всего, в случае, если модификатор класса val является избыточным (и ; в конце строки тоже).

Далее, вы не можете определить, какое-то значение с универсального типа, так Scala компилятор генерирует ошибку not found: type T в этой линии (на самом деле, какой тип T пропуск этой линии на код?)

implicit val distinctRawCommandReader: BSONDocumentReader[DistinctRawCommandResult[T]] = Macros.reader[DistinctRawCommandResult[T]]; 

Чтобы использовать читатели с несколькими типами используют Macros.handlerOps от импорта reactivemongo.bson.Macros.Options._

//define generic top trait (must be sealed) 
sealed trait MyGenericType 

//trait implementations. Driver saves classname field to database to know, what instance of class need to create. 
case class OneType(n: Int) extends MyGenericType 
case class TwoType(s: String) extends MyGenericType 

//and so on 

case class DistinctRawCommandResult(values: List[MyGenericType], 
            stats: CommandStatus, 
            ok: Double) 

case class CommandStatus(n: Int, 
         nscanned: Int, 
         nscannedObjects: Int, 
         timems: Int, 
         cursor: String) 

object DistinctRawCommandResultBsonFormatter { 
    implicit val commandStatusReader = Macros.reader[CommandStatus] 

    // find all subtypes of MyGenericType 
    implicit val distinctRawCommandReader = Macros.handlerOpts[MyGenericType, AllImplementations] 
} 

Для получения дополнительной документации см reactivemongo.bson.Macros.Options объекта.