好的,首先我在这里发布问题是新手,所以请放轻松。
我觉得我已经让他们看到了这个问题,但我肯定一定要慢一点,因为我无法做到这一点 - 我知道这应该很简单。
我有一个班级:
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:a,如果我使用'a'调用该服务,则返回:
[{
},{
},{
}]
所以它正在返回,它只是没有序列化任何数据......我试过重载unapply方法并试图找出案例类是否可以帮助我 - 但它并没有点击我的虚弱心灵。有什么帮助吗?
答案 0 :(得分:2)
我认为你可能需要添加一个包装器。看来mappers无法在没有一点帮助的情况下处理这个问题,虽然这对于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
}
答案 1 :(得分:0)
我相信Lift的json支持需要case类,因此可能不适用于Mapped对象。
您可以尝试使用toJson方法中的Produce字段创建一个case类。
我也发现这看起来很有用:http://scala-programming-language.1934581.n4.nabble.com/Mapper-lt-gt-JObject-bridge-td1981293.html