Skip to content

Instantly share code, notes, and snippets.

@loicknuchel
Created March 24, 2016 09:26
Show Gist options
  • Save loicknuchel/f1f4fe756dbec760c8f0 to your computer and use it in GitHub Desktop.
Save loicknuchel/f1f4fe756dbec760c8f0 to your computer and use it in GitHub Desktop.
Problem with Play macro Json.format[T]

En mettant en place du typage pour mes IDs, je me retrouve avec un No apply function found matching unapply parameters quand j'utilise la macro Json.format[T] de Play :(

Du coup je suis obligé de définir explicitement les Reads et Writes

D'ailleurs, le type Email ne pose pas de problème. Je pense que ça doit venir du fait que Id est générique... Mais j'ai pas trouvé comment fixer le problème.

Si quelqu'un à une idée de ce qu'il peut manquer...

Ex: User.scala, Id.scala, Email.scala et TString.scala :)

PS: I'm using Play 2.5

@julien-lafont
Copy link

Pour la partie Route/Form/Slick, j'utilise https://github.com/godenji/play-iso qui fait le taf d'une manière intéressante (avec une macro qui permet de convertir automatiquement Long=>Id(long), Id(long) => Long, et ça passe par une ValueClass -pas de surcoût au runtime-).

J'ai essayé de faire la même chose pour play-json (https://github.com/tabmo/play-iso/blob/slick-3-1/src/main/scala/bind/Json.scala), sans grand succès... (ça marche pour le reader/rules, pas pour le writer. j'ai pas creusé plus que ça...)

@loicknuchel
Copy link
Author

cool :) je vais checker ça...
Du coup, tu écris tes Writer à la main ?

@julien-lafont
Copy link

edit : en fait c'est le contraire :) Je writes très bien, mais je lis pas :)

Du coup oui, à défaut d'avoir mieux, j'ai rajouter les readers manuellement pour les Ids que je dois parser (le code ci-dessous fait les rules/Writes pour jto-validation)

   // -- Ids
  // Generic writer for all ID value class
  protected implicit def valueClassWrites[T <: slick.lifted.MappedTo[UUID]]: Write[T, JsString] = Write(id => JsString(id.value.toString))

  // Custom readers
  protected implicit val deviceIdRules = fromUUID(DeviceId)
  protected implicit val referentialIdRules = fromUUID(ReferentialId)
  protected implicit val dealIdRules = fromUUID(DealId)
  ....

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment