Frage

Ich bin mit liftweb und scala. Ich entwickle json-Rest api für rss Agregator und ich habe zwei Probleme:

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")
 }
}

Ich bekomme Fehler auf beiden ersten und zweiten Zeilen getFirstRssItem Methode:

Erste ist, dass Compiler kann nicht Byfield Methode finden - was ich zu importieren muß

Zweite ist, dass Compiler sagt es nicht Methode Titel in item val finden. Nach liftweb Wiki kann ich Feld Name als Methode aufrufen, aber item hat den Typ Box [my.domain.model.RssItem]. Was mache ich falsch? RssItem Modell:

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"
}
War es hilfreich?

Lösung

Wie Debilski weist darauf hin, findet () gibt eine Box [RssItem], die leer ist, wenn es keine Gegenstände oder Full (Artikel), wenn ein Element gefunden wurde, so den Titel immer erfordert eine Karte () oder mit dem für das Verständnis (das ist syntaktischer Zucker auf der Karte / flatMap / Filter).

In Bezug auf Ihre Anfrage, die Sie wollen von () statt Byfield (). Ich habe aufgeräumt Ihren Code so kompiliert:

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>
  }
}

Beachten Sie, dass, wenn es keine Einträge in der Datenbank vorhanden sind, dann werden Sie ein 404 zurückkehren mit „Nein RSS-Daten“ im Körper (anstatt eine Null-Zeiger-Ausnahme).

Ich hoffe, das hilft.

Andere Tipps

Sie fragen, ob Sie versuchen können, net.liftweb.mapper.By (statt Byfield) verwendet wird, so etwas wie ...

  

Import net.liftweb.mapper.By

     

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

Find gibt einen Box, (die Sie gerade wie Option verwenden können,), da es nicht klar ist, ob ein tatsächliches Element gefunden werden kann.

Statt item.title, würden Sie so etwas wie

schreiben
item.map(_.title) openOr "untitled"

item.map(_.title) gibt Ihnen eine Box des Titels, die entweder den Titel enthält oder leer ist (im Fall wurde kein Eintrag gefunden). Ohne Box, würden Sie einen Null-Fehler dort haben. openOr dann entweder gibt den Inhalt des Box oder angegebenen Standardwert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top