Skip to content

Instantly share code, notes, and snippets.

@jroper
Created November 15, 2012 06:56
Show Gist options
  • Save jroper/4077113 to your computer and use it in GitHub Desktop.
Save jroper/4077113 to your computer and use it in GitHub Desktop.
Compile errors with Json reads/writes
[info] Compiling 6 Scala sources and 1 Java source to /Users/jroper/src/play/framework/test/integrationtest-scala/target/scala-2.10/classes...
[error] /Users/jroper/src/play/framework/test/integrationtest-scala/app/controllers/TestController.scala:26: value and is not a member of play.api.libs.json.Reads[String]
[error] Note: implicit value cookieReads is not applicable here because it comes after the application point and it lacks an explicit result type
[error] implicit val cookieReads = Json.reads[Cookie]
[error] ^
[error] /Users/jroper/src/play/framework/test/integrationtest-scala/app/controllers/TestController.scala:27: value and is not a member of play.api.libs.json.OWrites[String]
[error] Note: implicit value cookieWrites is not applicable here because it comes after the application point and it lacks an explicit result type
[error] implicit val cookieWrites = Json.writes[Cookie]
[error] ^
[error] /Users/jroper/src/play/framework/test/integrationtest-scala/app/controllers/TestController.scala:29: value and is not a member of play.api.libs.json.OWrites[String]
[error] Note: implicit value echoWrites is not applicable here because it comes after the application point and it lacks an explicit result type
[error] implicit val echoWrites = Json.writes[Echo]
[error] ^
[error] /Users/jroper/src/play/framework/test/integrationtest-scala/app/controllers/TestController.scala:42: No implicit Reads for List[play.api.mvc.Cookie] available.
[error] implicit val toReturnReads = Json.reads[ToReturn]
[error] ^
[error] /Users/jroper/src/play/framework/test/integrationtest-scala/app/controllers/TestController.scala:53: Cannot write an instance of controllers.TestController.Echo to HTTP response. Try to define a Writeable[controllers.TestController.Echo]
[error] Ok(Echo(method, version, body.asBytes(), headers.toMap, request.session.data, request.flash.data, remoteAddress,
[error] ^
[error] /Users/jroper/src/play/framework/test/integrationtest-scala/app/controllers/TestController.scala:58: No Json deserializer found for type controllers.TestController.ToReturn. Try to implement an implicit Reads or Format for this type.
[error] Json.fromJson[ToReturn](request.body).fold({ errors =>
[error] ^
[error] 6 errors found
[error] (compile:compile) Compilation failed
[error] application -
package controllers
import play.api.mvc.{Cookie, Action, Controller}
import play.api.libs.json._
import org.apache.commons.codec.binary.Base64
import play.api.libs.json.JsString
import play.api.data.validation.ValidationError
/**
* Used for testing stuff.
*/
object TestController extends Controller {
implicit val byteArrayWrites = new Writes[Array[Byte]] {
def writes(o: Array[Byte]) = JsString(new String((Base64.encodeBase64(o))))
}
implicit val byteArrayReads = new Reads[Array[Byte]] {
def reads(json: JsValue) = json match {
case JsString(value) => JsSuccess(Base64.decodeBase64(value.getBytes))
case _ => JsError(Seq(JsPath() -> Seq(ValidationError("validate.error.expected.jsstring"))))
}
}
implicit val cookieReads = Json.reads[Cookie]
implicit val cookieWrites = Json.writes[Cookie]
implicit val echoWrites = Json.writes[Echo]
case class Echo(method: String,
version: String,
body: Option[Array[Byte]],
headers: Map[String, Seq[String]],
session: Map[String, String],
flash: Map[String, String],
remoteAddress: String,
queryString: Map[String, Seq[String]],
uri: String,
path: String)
implicit val toReturnReads = Json.reads[ToReturn]
case class ToReturn(status: Int = 200,
body: Option[Array[Byte]] = None,
headers: Map[String, String] = Map(),
cookies: List[Cookie] = List(),
session: Map[String, String] = Map(),
flash: Map[String, String] = Map())
def echo = Action(parse.raw) { request =>
import request._
Ok(Echo(method, version, body.asBytes(), headers.toMap, request.session.data, request.flash.data, remoteAddress,
queryString, uri, path))
}
def slave = Action(parse.json) { request =>
Json.fromJson[ToReturn](request.body).fold({ errors =>
BadRequest(errors.toString())
}, { toReturn =>
toReturn.body.map(body => Ok(toReturn.status, body)).getOrElse(Ok(toReturn.status))
.withHeaders(toReturn.headers.toSeq:_*)
.withCookies(toReturn.cookies:_*)
.withSession(toReturn.session.foldLeft(request.session)((s, item) => s + item))
.flashing(toReturn.flash.toSeq:_*)
})
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment