2011-12-23 40 views
1

好的,首先我是新來發布問題的,所以對我來說很簡單。如何從映射器持久化類中爲Lift/Scala Json webservice服務

我覺得我已經sc住了互聯網來解決這個問題,而且我肯定一定很慢,因爲我不能把它弄清楚 - 我知道這應該很簡單。

我有一個類:

class Produce extends LongKeyedMapper[Produce] with IdPK { 
     def getSingleton = Produce 
     object producetype extends MappedString(this,20) 
     object name extends MappedString(this,20) 
     object description extends MappedString(this,255) 

    } 

的對象有幾個輔助方法和一些其他的東西我都拼湊在一起,試圖得到這個工作:

object Produce extends Produce with LongKeyedMetaMapper[Produce] { 
    private implicit val formats = net.liftweb.json.DefaultFormats 
    override def fieldOrder = List(producetype, name, description) 

    def search(str: String): List[Produce] = { 
    val strLC = str.toLowerCase() 
    Produce.findAll(By(Produce.producetype, strLC)) 
    } 

    implicit def toJson(item: Produce): JValue = Extraction.decompose(item) 
    implicit def toJson(items: List[Produce]): JValue = Extraction.decompose(items) 

} 

我休息服務做基本的東西,並與此匹配:

serve("api"/"item" prefix { 
    case "search" :: q JsonGet _ => 
     (for { 
     searchString <- q ::: S.params("q") 
     item <- Produce.search(searchString) 
     } yield item): JValue 
    }) 

所以我很高興,它的工作,我得到了它匹配荷蘭國際集團..並返回JSON,問題是: 比方說,我在DB 3行與producetype:一,如果我叫以「」它返回的服務:

[{ 

},{ 

},{ 

}] 

所以它返回,它只是沒有序列化任何數據......我試圖重載不適用的方法,並試圖找出案例類是否可以幫助我 - 但它並沒有點擊我微弱的頭腦。任何幫助?

+0

發表後,我得到它的工作,但顯然我的意見沒有發佈時,我跟進了。抱歉。 (item:Produce):JValue =(「Produce item」 - >(「name」 - > item.name.toString)〜(「description」 - > item.description.toString)) implicit def toJson(items:List [Produce]):JValue =(「Produce items」 - > items.map(i => toJson(i))) ' 希望這可以幫助某人。 – mikemwalsh

回答

2

我想你可能需要添加的包裝。看起來,mapper不能在沒有一點幫助的情況下處理這個問題,雖然這對於Lift來說是有意義的 - 同時還有其他很棒的REST和Json函數。

類似下面,然後包裝並在REST映射器之間交換呼叫:

case class ProduceWrapper(producetype: String, name: String, description: String) 

object ProduceWrapper { 

    private implicit val formats = net.liftweb.json.DefaultFormats 

    def apply(in: JValue): Box[ProduceWrapper] = Helpers.tryo{in.extract[ProduceWrapper]} 

    def unapply(in: JValue): Option[ProduceWrapper] = apply(in) 

    def unapply(in: Any): Option[(String, String, String)] = { 
    in match { 
     case i: ProduceWrapper => Some((i.producetype, i.name, i.description)) 
     case _ => None 
    } 
    } 

    implicit def toJson(item: ProduceWrapper): JValue = Extraction.decompose(item) 
    implicit def toJson(items: List[ProduceWrapper]): JValue = Extraction.decompose(items) 

} 

在REST類:

serve("api"/"produce" prefix { 
    case Nil JsonPut ProduceWrapper(item) -> _ => Produce.add(item): JValue 
} 

然後在農產品類:

def add(item: ProduceWrapper): ProduceWrapper = { 
    Produce.create.name(item.name).description(item.description).save 
    item 
    }