Ich habe einen Controller in Play Framework (2.5.4) verwaltet von sbt.Play Framework kann play-json impliziter Reader & Writer nicht importieren
userController.scala
package controllers
// import models.User
import com.neruti.User
import play.api._
import play.api.mvc._
import play.api.libs.json._
import play.api.libs.functional.syntax._
import pdi.jwt._
import pdi.jwt.{JwtPlayImplicits, JwtSession}
import play.api.mvc.Controller
import java.time.LocalDate
import java.util.UUID
class UserProfileController extends Controller with JwtPlayImplicits {
def putUserProfile = Action(parse.json) {request =>
val userProfile: JsResult[User] = request.body.validate[User]
userProfile.map {
case user:User => Ok("Its good")
}.recoverTotal{
e=>BadRequest("Detected error" + JsError.toFlatJson(e))
}
}
}
Nachfolgend finden User-Modell in einem anderen separaten Modul (Kern) verwaltet von Maven. Ein Multi-Modul Maven-Muster.
User.scala
package com.neruti
import play.api.libs.json._
import play.api.data.validation.ValidationError
import play.api.libs.functional.syntax._
case class User(
username: String,
email: Option[String] = None
)
object User {
implicit val userReads: Reads[User] =(
(__ \ "username").read[String] and
(__ \ "email").readNullable[String]
)(User.apply _)
implicit val userWrites: Writes[User] =(
(__ \ "username").write[String] and
(__ \ "email").writeNullable[String]
)(unlift (User.unapply))
}
Ausgabe ist im Inneren des userController.scala
, ist es nicht implizit JSON Leser & Schriftsteller in ihrem Umfang zu sehen.
userController.scala:44: No Json deserializer found for type com.neruti.User. Try to implement an implicit Reads or Format for this type.
[error] val userProfile: JsResult[User] = request.body.validate[User]
Hat import com.neruti.User._
, importiert keine impliziten Methoden.
Allerdings, wenn ich import models.User
unkommentiert, mit models
Paket im Spiel, funktioniert es.
Jeder Rat wird sehr geschätzt.
Ich bin mir nicht sicher, ob ich Ihren Code vollständig verstanden habe. Haben Sie zwei Klassen namens "User"? Eins im 'models' Paket und das andere im' com.neruti' Paket? –
Ja, das Paket 'models' dient zum Testen und Verifizieren, dass mein Code ordnungsgemäß funktioniert. Für die Produktion wird nur 'com.neruti' Paket verwendet. –