22 des champs de limite dans Scala 2.11 + Play Framework 2.3 Cas des classes et des fonctions
Scala 2.11 est sorti et le 22 champs de limite pour les classes de cas semble être fixe (Scala Problème, Notes De Version).
Cela a été un problème pour moi parce que j'utilise des classes de cas de modèle de base de données des entités qui ont plus de 22 des champs dans le Jeu + Postgres Async. Ma solution à Scala 2.10 était de casser les modèles en plusieurs classes de cas, mais je trouve cette solution difficile à maintenir et à étendre, et j'espérais que je pourrais mettre en place quelque chose comme décrit ci-dessous après le passage à Jouer 2.3.0-RC1 + Scala 2.11.0:
package entities
case class MyDbEntity(
id: String,
field1: String,
field2: Boolean,
field3: String,
field4: String,
field5: String,
field6: String,
field7: String,
field8: String,
field9: String,
field10: String,
field11: String,
field12: String,
field13: String,
field14: String,
field15: String,
field16: String,
field17: String,
field18: String,
field19: String,
field20: String,
field21: String,
field22: String,
field23: String,
)
object MyDbEntity {
import play.api.libs.json.Json
import play.api.data._
import play.api.data.Forms._
implicit val entityReads = Json.reads[MyDbEntity]
implicit val entityWrites = Json.writes[MyDbEntity]
}
Le code ci-dessus ne peut pas compiler avec le message suivant pour le "Lit" et "Écrit":
No unapply function found
Mise à jour du "Lit" et "Écrit" à:
implicit val entityReads: Reads[MyDbEntity] = (
(__ \ "id").read[Long] and
(__ \ "field_1").read[String]
........
)(MyDbEntity.apply _)
implicit val postWrites: Writes[MyDbEntity] = (
(__ \ "id").write[Long] and
(__ \ "user").write[String]
........
)(unlift(MyDbEntity.unapply))
Aussi ne fonctionne pas:
implementation restricts functions to 22 parameters
value unapply is not a member of object models.MyDbEntity
Ma compréhension est que la Scala 2.11 a encore quelques limitations sur les fonctions et que quelque chose comme ce que j'ai décrit ci-dessus n'est pas encore possible. Cela semble bizarre pour moi que je ne vois pas l'avantage de la levée des restrictions sur les classes de cas si c'est un des principaux utilisateurs des cas est toujours pas pris en charge, alors je me demandais si il me manque quelque chose.
Des pointeurs vers des questions ou des détails de mise en œuvre sont plus que bienvenus! Merci!
- Jetez un oeil à pertinentes pull request description: la première chose que mentionné que la limitation est le manque de
unapply
pour >22 classes et cela a été fait pour une raison (AFAIR, il y aurait une exponentielle blowup dans classfiles taille) - Une classe de cas avec >22 params ne peut pas avoir
unapply
, car elle aurait à se convertir à uneTupleX
avec X>le 22, et les tuples sont toujours limités à 22. Le plus triste est queJson.format[MyCaseClass]
(la macro-fonction de la solution) n'a pas besoin d'avoir cette limitation (il pourrait réaliser que c'est une affaire de classe et il suffit d'extraire les champs directement, sans l'annuler, comme le pattern matching), mais actuellement, il semble pourunapply
et échoue... - Pour ceux que cela intéresse, voici un billet de suivi de la suppression de cette limitation: github.com/playframework/playframework/issues/3174
- Le ticket est toujours ouvert. Est-il encore un problème avec >22 2.3 avec Scala 2.11.1? Effectuer des recherches sur des piles pour un nouveau projet & je me demandais si cela va être un problème. Thx
Vous devez vous connecter pour publier un commentaire.
Nous avons également été la rupture de l'un de nos modèles en plusieurs classes de cas, mais cela a été rapidement devenir ingérable. Nous utilisons Slick que notre object relational mapper, et Slick 2.0 est livré avec un générateur de code que nous utilisons pour générer des classes (qui viennent avec appliquent des méthodes et une copie des constructeurs pour imiter des classes de cas) ainsi que les méthodes utilisées pour instancier les modèles de Json (nous ne génère pas automatiquement de méthodes pour convertir les modèles en Json parce que nous avons de trop nombreux cas particuliers à traiter). À l'aide de la Nappe générateur de code ne nécessite pas l'utilisation de la Nappe de votre object relational mapper.
Cela fait partie de l'entrée du générateur de code - cette méthode prend un JsObject et l'utilise soit pour instancier un nouveau modèle ou la mise à jour d'un modèle existant.
Par exemple, avec notre ActivityLog modèle de ce produit le code suivant. Si "original" n'est alors ce qui est appelé à partir d'un "createFromJson" méthode et on instancie un nouveau modèle; si "original" est Certains(activityLog) alors celui-ci est appelé à partir d'un "updateFromJson" méthode et de nous mettre à jour le modèle existant. Le "condenseUnit" méthode appelée sur le "val tre = ..." ligne dure Seq[Essayer[Unité]] et produit un essai[Unité]; si la Seq a des erreurs, puis l'Essayer[Unité] concatène les messages d'exception. Le parseJsonField et parseField méthodes ne sont pas générées - ils sont référencés dans le code généré.
Vous pouvez utiliser Jackson Scala de module. Jouer json fonctionnalité est intégrée à Jackson scala . Je ne sais pas pourquoi ils ont mis un 22 limite de champ, ici, jackson prend en charge plus de 22 des champs. Il peut être judicieux de demander un appel de fonction peut ne jamais utiliser plus de 22 paramètres, mais nous avons des centaines de colonnes à l'intérieur de la base de données d'entité, de sorte que cette restriction est ici ridicule et qui rend le Jeu moins productif jouet.
check this out:
les cas où des classes de cas peut ne pas fonctionner; l'un de ces cas est que les classes de cas ne peut pas prendre plus de 22 des champs. Un autre cas peut être que vous ne savez pas à propos de schéma à l'avance. Dans cette approche, les données est chargé comme un RDD de la ligne des objets. Le schéma est créé séparément à l'aide de la StructType et StructField objets qui représentent une table et un champ respectivement. Le schéma est appliqué à la ligne RDD pour créer DataFrame Spark.
Je suis en train de faire une bibliothèque. s'il vous plaît essayer cette https://github.com/xuwei-k/play-twenty-three
J'ai essayé Informe "Automatique Typeclass Dérivation" en fonction de la solution proposée dans une autre réponse, et il n'a pas fonctionné pour l'un de nos modèles - jetait StackOverflow exceptions (cas de la classe avec ~30 domaines et 4 imbriqués les collections de classes avec 4 à 10 champs).
Donc, nous avons adopté cette solution et cela a fonctionné parfaitement. A confirmé que par l'écriture ScalaCheck test. De l'avis qu'il faut Jouer Json 2.4.
Il semble que ce occupe de tout bien.
+22 de la classe de cas de formatage et de plus pour les play-json
https://github.com/xdotai/play-json-extensions
Prend En Charge Scala 2.11.x, 2.12.x, et 2.13.x et jouer 2.3, 2.4, 2.5 et 2.7
Et est référencé dans la jouer-json problème comme la meilleure solution (mais pas encore fusionné)