我正在Scala中开发我的第一个Play 2.1应用程序。 我想要完成的任务是将json解析为3个不同的case类。问题是 - 我不知道在哪里声明所有案例类。每个类都在自己的文件中或全部在一个文件中。这是我所做的(它不起作用,案例值在控制器对象中不可见):
文件LoginBase.scala
package models
abstract class LoginBase
case class Login(email: String, password: String) extends LoginBase
case class RestoreLogin(email: String, captchaID: String, captchaAnswer: String) extends LoginBase
case class RegisterLogin(email: String, password: String, captchaID: String, captchaAnswer: String) extends LoginBase
档案
package controllers
import play.api._
import play.api.mvc._
import play.api.data._
import play.api.data.Forms._
import play.api.Play.current
import play.api.cache.Cache
import play.api.libs.json._
import play.api.mvc._
import play.api.libs.functional.syntax._
import nl.captcha.Captcha
import nl.captcha.Captcha._
import nl.captcha.gimpy.FishEyeGimpyRenderer
import nl.captcha.text.renderer.ColoredEdgesWordRenderer
import nl.captcha.text.renderer.DefaultWordRenderer
import nl.captcha.gimpy.DropShadowGimpyRenderer
import java.io.ByteArrayOutputStream
import javax.imageio.ImageIO
import java.util.UUID
import play.api.libs.functional.syntax._
import models.LoginBase
object LoginActions extends Controller {
implicit val loginReads = (
(__ \ "email").read[String] and
(__ \ "password").read[String]
)(Login.apply _)
implicit val restoreLoginReads = (
(__ \ "email").read[String] and
(__ \ "captchaID").read[String] and
(__ \ "captchaAnswer").read[String]
)(RestoreLogin)
implicit val registerLoginReads = (
(__ \ "email").read[String] and
(__ \ "password").read[String] and
(__ \ "captchaID").read[String] and
(__ \ "captchaAnswer").read[String]
)(RegisterLogin)
def registerLogin = Action(parse.json){
/* To be implementd */
}
}
如果有人可以帮助我,我会很感激。 我所能找到的只是REPL示例,但我遗漏了一些基本的东西 - 在哪里放置所有代码片段?什么是文件结构?
谢谢, 安德烈。
答案 0 :(得分:1)
在单个文件中包含多个类和对象在Scala中被认为是好的形式,只要这些类紧密相关。
请参阅Elements of Scala Style?了解更多详情。
以下是在restful ws中将json转换为scala case类的示例。
在这里输入代码
import play.api.libs.json.{Reads, JsError, Json}
import play.api.libs.json.JsValue
object someController e
xtends Controller{
case class SomeResource(val Id:String, val someType:String, val Serialno:String)
implicit val reads:Reads[SomeResource] = Json.reads[SomeResource]
/**
* save some object
*/
def someService = Action(parse.json){request=>
unmarshalOrderResource(request, (resource: SomeResource) => {
val someValue = SomeResource(resource.Id,
resource.someType,resource.Serialno);
someservice.save(someValue);
Created(someValue.Id)
})
}
// method
private def unmarshalOrderResource(request: Request[JsValue],
block: (SomeResource) => Result): Result = {
request.body.validate[SomeResource].fold(
valid = block,
invalid = (e => {
val error = e.mkString
Logger.error(error)
BadRequest(error)
})
)
}
}
答案 1 :(得分:0)
Java和Scala之间不同的一点是Scala不需要特定的文件/文件夹结构。包甚至不必与文件夹对应。此外,每个文件可以有多个类。
基本上,你拥有的很好。
必须保持不变的是进口。所以,如果你问为什么你的东西不能编译,请尝试导入模型包中的所有内容。
import models._