Liftweb从scalaz返回响应

时间:2014-10-10 12:42:14

标签: scala lift scalaz

我有下一个代码,返回:

 import com.twitter.util.{Future, NonFatal}
 import net.liftweb.http.{LiftResponse, OkResponse}

 def service(str: Strign) : Future[ValidationNel[String, LiftResponse]] = {
   if str == "ok"
     Future(OkResponse().successNel[String])
   else
     Future.value("Invalid string".failureNel[LiftResponse]) 
 }

 //and routes for it 

 serve {
   case "user" :: str :: _ Get _ => 
     service(str)   
 } 

但是当我跑步时,得到了 No implicit view available from com.twitter.util.Future[scalaz.ValidationNel[String,net.liftweb.http.LiftResponse]] => net.liftweb.http.LiftResponse. 如何将其转换为ListResponse?

2 个答案:

答案 0 :(得分:0)

错误基本上表示Lift无法呈现

com.twitter.util.Future[scalaz.ValidationNel[String,net.liftweb.http.LiftResponse]]

(在编译时。)要解决您的问题,您可能需要分解您的任务。首先,找出Lift是否可以呈现“验证”的东西:

scalaz.ValidationNel[String,net.liftweb.http.LiftResponse]

如果不能,那么你将不得不教电梯。因此,您应该使用类型签名ValidationNel[***] => LiftResponse创建隐式(在范围中可见)。您可以将其转换为Box,它具有呈现错误的默认方式(空框)。或者您应该使用“if”和2个分支编写自定义代码,其中一个是BadResponse,另一个是成功。

另一个任务是检查Lift是否知道热来呈现twitter-s Future - s。同样,您应该创建一个简单的数据并尝试将其渲染出来。像Future(OkResponse())一样。为了向Lift教授关于twitter Futures,您可能需要再次使用类型签名Future[T] => LiftResponse来实现隐式。这可能涉及RestContinuation

答案 1 :(得分:0)

Lift现在支持LAFuture的异步调用。这是一个示例代码:

case "delay" :: Nil Get _ =>
  LAFuture.build({
    Thread.sleep(2000)
    <b>Hello</b>
})

当您运行它并访问/延迟时,请求将在服务器上异步执行。

当然,您不会在实际代码中显式调用Thread.sleep,这仅用于示例目的。

此示例代码的完整项目位于https://github.com/dpp/lift_30_samples(此处有几个快速修复 - &gt; https://github.com/listatree/lift_30_samples)。

现在关于您尝试执行的转换,我建议您使用Lift的CanBind功能。这里有一个关于它们的示例:https://github.com/fmpwizard/lift_starter_2.4/tree/la-futures-2,它也使用了Lift的LAFuture,但是对它进行了一些转换(顺便说一下,这些转换就像Lift 2.6一样自动进行,所以请使用这个CanBind示例作为参考对于这里讨论的转换)

Lift还支持LAFuture for snippet渲染快速示例:

def render = "*" #> LAFuture.build({
  Thread.sleep(2000)
  <div>Hello</div>
})

这将使用Lift的Comet基础架构使代码段呈现异步。

此外,您可以使用并行片段,要求您包含与true平行的参数,如下所示:

<div data-lift="HelloWorld.howdy?parallel=true">The time is: <span id="time"></span</div>

并行代码段工作得很好,但它们消耗了宝​​贵的线程,Lift仍然需要一个解决方案,以便在服务器端实现真正的非阻塞代码段渲染。让我们来看看Lift 3即将发生的事情。