es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo escribir lecturas/escrituras JSON y también manejadores de ReactiveMongo cuando las clases de casos contienen un parámetro de tipo genérico?

En playframework, estoy intentando escribir los reads/writes para JSON, junto con los controladores BSON de reactivemongo para mi clase de caso:

import play.api.libs.json._
import reactivemongo.api.bson._

case class SomeThing[T](id: String, name: String, value: T)
object SomeThing {
  implicit val stWrites = Json.writes[SomeThing]
  implicit val stReads  = Json.reads[SomeThing]

  implicit val stHander = Macros.handler[SomeThing]
}

Debido a que mi clase de caso tiene un parámetro de tipo T, actualmente estoy obteniendo este error de compilación:

la clase SomeThing toma parámetros de tipo

¿Cómo puedo resolver este problema?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, necesitas proporcionar manejadores BSON para el parámetro de tipo T. Una forma de hacer esto es utilizando los rasgos BSONDocumentWriter y BSONDocumentReader proporcionados por ReactiveMongo.

    Aquí tienes un ejemplo de implementación para una clase de caso con un parámetro de tipo:

    import play.api.libs.json._
    import reactivemongo.api.bson._
    import reactivemongo.play.json.compat._
    
    case class SomeThing[T](id: String, name: String, value: T)
    
    object SomeThing {
      // Escritores y lectores para serialización/deserialización JSON
      implicit def stWrites[T: Writes] = Json.writes[SomeThing[T]]
      implicit def stReads[T: Reads] = Json.reads[SomeThing[T]]
    
      // Manejadores BSON para ReactiveMongo
      implicit def stHandler[T: BSONDocumentWriter: BSONDocumentReader] = Macros.handler[SomeThing[T]]
    }
    

    Ten en cuenta que añadimos dos límites de tipo en BSONDocumentWriter y BSONDocumentReader para T. Estos límites aseguran que los manejadores BSON también existan para el parámetro de tipo.

    Con estos cambios, deberías poder utilizar SomeThing con cualquier tipo que tenga manejadores BSON.

Comments are closed.