J'ai eu le même souci il y a quelques jours mais je n'ai rien trouvé dans la documentation concernant les sealed traits
pour modéliser ADT dans MongoDB.
Au final, j'ai utilisé sealed class
comme suggéré dans le officiel référentiel github du pilote scala
.
Si vous voulez vraiment utiliser des traits (en raison de la définition des méthodes abstraites), vous pouvez faire quelque chose comme ceci :
package example.model
import example.model.adt._
import org.mongodb.scala.bson.ObjectId
import org.mongodb.scala.bson.codecs.Macros._
import org.mongodb.scala.bson.codecs.DEFAULT_CODEC_REGISTRY
import org.bson.codecs.configuration.CodecRegistries.{fromProviders, fromRegistries}
trait MongoModel {
def _id: ObjectId
}
object MongoModel {
val codecRegistery = fromRegisteries(fromProviders(classOf[A]), DEFAULT_CODEC_REGISTRY)
}
Vous pouvez maintenant définir votre ADT pour A avec sealed class
.
package example.model.adt
import example.model.MongoModel
import org.mongodb.scala.bson.ObjectId
sealed class A
final case class B(_id: ObjectId) extends A with MongoModel
final case class C(_id: ObjectId) extends A with MongoModel
Cette réponse ne résout pas directement la question, mais fournit une solution de contournement réalisable. Notez que ce code n'est qu'un exemple. Pour une implémentation plus complète, vous pouvez voir ce dépôt github .