2013-04-20 138 views
1

我正在Scala中开发我的第一个Play 2.1应用程序。 我试图完成的任务是将json解析为3个不同的案例类。问题是 - 我不知道在哪里申报所有案例类。每个类都在自己的文件中,或全部在一个文件中。这里是我做了什么(这是行不通的,案例值不在控制器对象可见):scala playframework json隐式case类转换

  1. 文件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 
    
  2. 文件

    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

Java和Scala不同之处在于Scala不需要特定的文件/文件夹结构。这些软件包甚至不必对应于文件夹。另外,每个文件可以有多个类。

基本上,你有什么是好的。

必须保持不变的是进口。所以,如果你问为什么你的东西不能编译,请尝试导入模型包中的所有东西。

import models._ 
1

只要这些类紧密相关,在单个文件中拥有多个类和对象在Scala中被认为是一种很好的形式。

请参考Elements of Scala Style?以获得更详细的答案。

这里是将json转换为restful ws中的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) 
      }) 
     ) 
    } 

} 
+0

欢迎SO!请编辑您的答案,以提供您在此处建议的内容。 – Derek 2013-11-21 20:04:36