1

好的,首先我是在这里发布问题的新手,所以请放轻松。

我觉得我已经浏览了互联网来解决这个问题,而且我肯定会很慢,因为我无法做到这一点 - 我知道这应该很简单。

我有一堂课:

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,问题是:假设我在数据库中有 3 行具有生产类型:a,如果我用 'a' 调用服务,它会返回:

[{

},{

},{

}]

所以它正在返回,它只是没有序列化任何数据......我已经尝试重载 unapply 方法并试图弄清楚案例类是否可以帮助我 - 但它并没有点击我虚弱的头脑。有什么帮助吗?

4

2 回答 2

2

我认为您可能需要添加一个包装器。似乎映射器在没有一点帮助的情况下无法处理这个问题,尽管这在 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
  }
于 2012-02-01T23:43:14.773 回答
0

我相信 Lift 的 json 支持需要案例类,因此可能不适用于 Mapped 对象。

您可以尝试在 toJson 方法中创建一个使用 Produce 字段构造的案例类。

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

于 2011-12-25T22:37:49.323 回答