2013-04-20 177 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