如何从mapper持久化类中提供Lift/Scala Json web服务



好吧,首先,我是第一次在这里发布问题,所以请原谅我。

我觉得我已经在互联网上找到了这个,我肯定是很慢,因为我就是不能正确-我知道这应该是简单的。

我有一个类:

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

我的rest服务正在做基本的事情,并与这个匹配:

serve( "api" / "item" prefix {
    case "search" :: q JsonGet _ =>
      (for {
        searchString <- q ::: S.params("q")
        item <- Produce.search(searchString)
      } yield item): JValue
  })
所以令我高兴的是,它成功了,我得到了匹配…并返回Json,问题是:假设我在数据库中有3行产品类型:a,如果我用'a'调用服务,它返回:
[{
},{
},{
}]

所以它返回,它只是没有序列化任何数据…我试过重载unapply方法,并试图弄清楚case类是否可以帮助我——但它没有在我虚弱的头脑中点击。任何帮助吗?

我认为您可能需要添加一个包装器。如果没有一点帮助,映射器似乎无法处理这个问题,尽管这在Lift中是有意义的——与所有其他伟大的REST和Json函数一起。

类似以下内容,然后在REST调用中的Wrapper和Mapper之间进行交换:

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
}

然后在Produce类中:

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

我认为Lift的json支持需要case类,因此可能无法与映射对象一起工作。

你可以尝试用toJson方法中的Produce字段创建一个case类。

我也发现这个看起来很有用:http://scala-programming-language.1934581.n4.nabble.com/Mapper-lt-gt-JObject-bridge-td1981293.html

相关内容

  • 没有找到相关文章