Created
November 15, 2012 06:56
-
-
Save jroper/4077113 to your computer and use it in GitHub Desktop.
Compile errors with Json reads/writes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[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 - |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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