2012-10-18 19 views
8

मैं इस नाटक ढांचा 2 कोड पर निर्भर करता है परिभाषित करें:एक अमूर्त वर्ग या ऐसी विशेषता है जो एक अंतर्निहित

import formatters.json.IdeaTypeFormatter._ 

object IdeaTypes extends Controller { 

    def list = Action { request => 
    Ok(toJson(IdeaType.find(request.queryString))) 
    } 

    def show(id: Long) = Action { 
    IdeaType.findById(id).map { ideatype => 
     Ok(toJson(ideatype)) 
    }.getOrElse(JsonNotFound("Type of idea with id %s not found".format(id))) 
    } 
} 

IdeaType वर्ग Entity फैली हुई है, और यह, साथी वस्तु, IdeaType है EntityCompanion फैली हुई है।

कि आप उम्मीद कर सकते हैं, मैं हर नियंत्रक में कोड के इस प्रकार है, तो मैं, कुछ इस तरह एक विशेषता के लिए बुनियादी व्यवहार को निकालने के लिए करना चाहते हैं:

abstract class EntityController[A<:Entity] extends Controller { 
    val companion: EntityCompanion 
    val name = "entity" 

    def list = Action { request => 
    Ok(toJson(companion.find(request.queryString))) 
    } 
    def show(id: Long) = Action { 
    companion.findById(id).map { entity => 
     Ok(toJson(entity)) 
    }.getOrElse(JsonNotFound("%s with id %s not found".format(name, id))) 
    } 
} 

लेकिन मैं निम्नलिखित त्रुटि मिलती है :

[error] EntityController.scala:25: No Json deserializer found for type List[A]. 
[error] Try to implement an implicit Writes or Format for this type. 
[error]  Ok(toJson(companion.find(request.queryString))) 
[error]   ^
[error] EntityController.scala:34: No Json deserializer found for type A. 
[error] Try to implement an implicit Writes or Format for this type. 
[error]  Ok(toJson(entity)) 
[error]    ^

मैं नहीं जानता कि यह बताने के लिए कैसे है कि निहित Writes कक्षाएं EntityController विशेषता को लागू करने (या अमूर्त वर्ग EntityController इनहेरिट)

से लागू किया जाएगा

- संपादित

अब तक अब मैं इसे इस तरह कर रहा हूँ:

abstract class CrudController[A <: Entity](
    val model: EntityCompanion[A], 
    val name: String, 
    implicit val formatter: Format[A] 
) extends Controller { 

और इस

object CrudIdeaTypes extends CrudController[IdeaType](
    model = IdeaType, 
    name = "type of idea", 
    formatter = JsonIdeaTypeFormatter 
) 

की तरह उपयोग मैं स्केला स्वचालित रूप से उपयोग कर इसे लेने के लिए मिल could't implicits। मैं इस आयात के साथ करने की कोशिश की लेकिन यह

import formatters.json.IdeaTypeFormatter._ 
+0

+1, ऐसा ही सोचा है, प्ले में सामान्य सीआरयूडी संचालन को कैसे दूर किया जाए। आपका केस, जेएसओएन प्रतिक्रिया मिश्रित JSON और views.html सामग्री + प्रमाणीकरण से निपटने से आसान है। लूत ओ 'बॉयलरप्लेट ... – virtualeyes

उत्तर

7

काम नहीं किया आप, निहित परिभाषित फिर बस सार निहित मूल्यों का ऐलान करते हैं और उन्हें व्युत्पन्न वर्ग में परिभाषित करने के लिए controler वर्गों खुद को चाहते हैं।

abstract class EntityController[A<:Entity] extends Controller { 
    protected implicit def entityWriter: Writes[A] 
    protected implicit def entityListWriter: Writes[List[A]] 
    ...  
} 

class MyEntity extends Entity { 
    ... 
} 

class MyEntityController extends EntityController[MyEntity] { 
    protected def entityWriter: Writes[MyEntity] = ... 
    protected def entityListWriter: Writes[List[MyEntity]] = ...  
} 

हालांकि, यह बहुत अधिक आम तौर पर अपनी इकाई के साथी वस्तु में, नियंत्रक के बाहर इन implicits परिभाषित करने के लिए व्यावहारिक है, ताकि वे संकलक आयात के बिना उन्हें स्वचालित रूप से पा सकते हैं। फिर, EntityController के निर्माता के लिए निहित मूल्यों पारित:

abstract class EntityController[A<:Entity](implicit entityWriter: Writes[A], entityListWriter: Writes[List[A]]) extends Controller { 
    ...  
} 

class MyEntity extends Entity { 
    ... 
} 
object MyEntity { 
    protected implicit def entityWriter: Writes[A] 
    protected implicit def entityListWriter: Writes[List[A]] 
} 

class MyEntityController extends EntityController[MyEntity] { 
    ... 
} 

अंतिम नोट, अंतर्निहित सूची में [MyEntity] शायद अनावश्यक (इस प्रकार केवल MyEntity के लिए अंतर्निहित स्पष्ट रूप से परिभाषित करने की आवश्यकता होगी) है। मैंने चेक नहीं किया है, लेकिन आम तौर पर इस "टाइपक्लास पैटर्न" का उपयोग करते समय, ढांचा प्रत्येक सूची [टी] के लिए पहले से ही एक अंतर्निहित परिभाषित करेगा, बशर्ते टी के लिए एक निहित है। यह शायद मामला है, हालांकि मैंने चेक नहीं किया है ।