liftweb:获得模型领域

时间:2010-08-12 05:27:42

标签: scala lift

我是liftweb和scala的新手。 我正在为rss agregator开发json-rest api,我有两个问题:

package my.domain

import net.liftweb.http._
import net.liftweb.http.rest._
import net.liftweb.json.JsonAST._
import net.liftweb.common.{Box,Full,Empty,Failure,ParamFailure}


import my.domain.model.{RssItem}

object ContentRest extends RestHelper {
 def getFirstRssItem = {
  val item = RssItem.find(ByField(RssItem.title, "test"))
  item.title
 }
 serve {
     case "api" :: "static" :: _ XmlGet _=> <b>Static</b>
     case "api" :: "static" :: _ JsonGet _ => JString("string")
 }
}

我在getFirstRssItem方法的第一行和第二行都出错:

首先是编译器找不到ByField方法 - 我需要导入什么?

其次是编译器说它无法在item val中找到方法标题。根据liftweb wiki,我可以将字段名称称为方法,但item的类型为Box [my.domain.model.RssItem]。我究竟做错了什么? RssItem模型:

package my.domain.model

import net.liftweb.mapper._

class RssItem extends KeyedMapper[Long, RssItem] {

    def getSingleton = RssItem

    def primaryKeyField = id
    object id extends MappedLongIndex(this)
    object title extends MappedString(this, 255)
    object description extends MappedText(this)
    object pubDate extends MappedDateTime(this)
}

object RssItem extends RssItem with KeyedMetaMapper[Long, RssItem] {
    def dbTable = "items"
}

3 个答案:

答案 0 :(得分:1)

正如Debilski指出的那样,find()返回一个Box [RssItem],如果没有项目则为Empty;如果找到一个项目则返回Full(item),因此获取标题需要map()或使用for comprehension (这是地图上的语法糖/ flatMap / filter)。

就查询而言,您需要By()而不是ByField()。我已经清理了你的代码以便编译:

object ContentRest extends RestHelper {
  def getFirstRssItemTitle = {
    for {
      item <- RssItem.find(By(RssItem.title, "test"))
    } yield item.title
  }

  serve {
    case "api" :: "static" :: _ XmlGet _=> 
    for {
      title <- getFirstRssItemTitle ?~ "No RSS data"
    } yield <b>{title}</b>
  }
}

请注意,如果数据库中没有项目,那么您将在正文中返回404“No RSS data”(而不是空指针异常。)

我希望这会有所帮助。

答案 1 :(得分:0)

想知道你是否可以尝试使用net.liftweb.mapper.By(而不是ByField),比如......

  

import net.liftweb.mapper.By

     

val item = RssItem.find(By(RssItem.title,“test”)

答案 2 :(得分:0)

Find会返回Box,(您可以像Option一样使用),因为不清楚是否可以找到实际的元素。

而不是item.title,你会写出像

这样的东西
item.map(_.title) openOr "untitled"

item.map(_.title)会为您提供一个Box标题,其中包含标题或为空(如果未找到任何项目)。没有Box,那里就会出现Null错误。 openOr然后返回Box或指定默认值的内容。