ReactiveMongo / ReactiveMongo-Play-Json

:leaves: Play JSON support for ReactiveMongo
http://reactivemongo.org/releases/0.1x/documentation/tutorial/play.html
Apache License 2.0
5 stars 13 forks source link

The implicit from import for json2bson toDocumentReader, toDocumentWriter not working with a case class above 22 fields #380

Closed anaganisk closed 6 months ago

anaganisk commented 6 months ago

ReactiveMongo Version (0.11.6, 0.11.11 / etc) - 1.1.0.play28-RC12 MongoDB version (2.6, 3.0 / etc) 7 (irrelevant to the issue faced) Operating System (Ubuntu 15.10 / MacOS 10.10 / Windows 10) Ubuntu JDK (Oracle 1.8.0_72, OpenJDK 1.8.x, Azul Zing) - openjdk 13.0.2 2020-01-14 Library Dependencies - play 2.8

Expected Behavior

  1. I have a case class, with more than 22 fields
  2. Implemented custom reads and writes to work around scala 22 fields limitation
  3. imports added
    import reactivemongo.play.json.compat._
    import json2bson.{toDocumentReader, toDocumentWriter} 
  4. The implicits to be generated BSONDocumentReader[ClassName] and BSONDocumentWriter[ClassName] by the imports

Actual Behavior

  1. could not find implicit value for parameter reader: reactivemongo.api.bson.BSONDocumentReader[ClassName]
  2. Interestingly, other custom reads and writes work as expected but, only with case classes with more than 22 fields have this issue happening.
  3. Alternatively , I used https://github.com/bizzabo/play-json-extensions library to test if that helps, but even then it exhibits the same issue.

Reproducible Test Case

I reproduced with a scala worksheet, using a basic test case, I used play-json-extensions, to keep it simple but it exhibits the same behaviour with a custom reads and writes too.

Works

image

import play.api.libs.json.Json
import reactivemongo.play.json.compat._
import json2bson.{toDocumentReader, toDocumentWriter}
import reactivemongo.api.bson.{BSONDocumentReader, BSONDocumentWriter}
import ai.x.play.json.implicits.optionWithNull
import ai.x.play.json.Encoders.encoder
import ai.x.play.json.Jsonx

case class test(
                        attrib1: Option[String],
                        attrib2: Option[String],
                        attrib3: Option[String],
                        attrib4: Option[String]
                      )

implicit val test22AboveFormat = Jsonx.formatCaseClass[test]

val r = implicitly[BSONDocumentReader[test]]
val w = implicitly[BSONDocumentWriter[test]]

Doesn't work

image

import play.api.libs.json.Json
import reactivemongo.play.json.compat._
import json2bson.{toDocumentReader, toDocumentWriter}
import reactivemongo.api.bson.{BSONDocumentReader, BSONDocumentWriter}
import ai.x.play.json.implicits.optionWithNull
import ai.x.play.json.Encoders.encoder
import ai.x.play.json.Jsonx

case class test22Above(
                        attrib1: Option[String],
                        attrib2: Option[String],
                        attrib3: Option[String],
                        attrib4: Option[String],
                        attrib5: Option[String],
                        attrib6: Option[String],
                        attrib7: Option[String],
                        attrib8: Option[String],
                        attrib9: Option[String],
                        attrib10: Option[String],
                        attrib11: Option[String],
                        attrib12: Option[String],
                        attrib13: Option[String],
                        attrib14: Option[String],
                        attrib15: Option[String],
                        attrib16: Option[String],
                        attrib17: Option[String],
                        attrib18: Option[String],
                        attrib19: Option[String],
                        attrib20: Option[String],
                        attrib21: Option[String],
                        attrib22: Option[String],
                        attrib23: Option[String],
                        attrib24: Option[String],
                        attrib25: Option[String]
                      )

implicit val test22AboveFormat = Jsonx.formatCaseClass[test22Above]

val r = implicitly[BSONDocumentReader[test22Above]]
val w = implicitly[BSONDocumentWriter[test22Above]]
cchantep commented 6 months ago

This issue tracker is for confirmed issue, which is not the case there (as there is many known limitation with Scala macro with case class > 22 fields, which is outside the scope of the lib).

As indicated the MailingList must be used.