1

我正在尝试从片段中的 Lift Menu.param 中提取参数,以便我可以使用它来创建一个命名的 Comet。但是,当我尝试在我的 Boot.scala 中使用 SnippetDisptach 将参数传递给代码段时,我得到了 NullPointerException,如下所示:http: //comments.gmane.org/gmane.comp.web.lift/44299

我创建的菜单项如下:

object AnItemPage {
// create a parameterized page
  def menu = Menu.param[Item]("Item", "Item",
                                s => fetchItem(s), item => item._id.toString) / "item"

  private def fetchItem(s:String) : Box[Item] = synchronized {
          ItemDAO.findById(ObjectId.massageToObjectId(s)) 
  }

}

我已将菜单添加到 SiteMap。我还创建了一个片段,我想获取 Item 参数。(我在这里使用 fmpwizard 的 InsertNamedComet 库):

 class AddCometItemPage(boxedItem: Box[Item]) extends InsertNamedComet with DispatchSnippet{
     val item : Item = boxedItem.openOr(null)
     override lazy val name= "comet_item_" + item._id.toString
     override lazy val cometClass= "UserItemCometActor"

     def dispatch = null
    }

我的下一步是创建这个类的一个实例,正如 David Pollak 在这里演示的那样:http: //comments.gmane.org/gmane.comp.web.lift/44299

这是我添加到 Boot.scala 中的内容:

LiftRules.snippetDispatch.append {
  case "item_page" => new AddCometItemPage(AnItemPage.menu.currentValue)
}

我的 item.html 引用了这个片段:

 <div class="lift:item_page">

当我编译并运行它时,我得到以下空指针异常:

Exception occurred while processing /item/5114eb4044ae953cf863b786

Message: java.lang.NullPointerException
net.liftweb.sitemap.Loc$class.siteMap(Loc.scala:147)
net.liftweb.sitemap.Menu$ParamMenuable$$anon$9.siteMap(Menu.scala:170)
net.liftweb.sitemap.Loc$class.allParams(Loc.scala:123)
net.liftweb.sitemap.Menu$ParamMenuable$$anon$9.allParams(Menu.scala:170)
net.liftweb.sitemap.Loc$class.net$liftweb$sitemap$Loc$$staticValue(Loc.scala:87)
net.liftweb.sitemap.Menu$ParamMenuable$$anon$9.net$liftweb$sitemap$Loc$$staticValue(Menu.scala:170)
net.liftweb.sitemap.Loc$$anonfun$paramValue$2.apply(Loc.scala:85)
net.liftweb.sitemap.Loc$$anonfun$paramValue$2.apply(Loc.scala:85)
net.liftweb.common.EmptyBox.or(Box.scala:646)
net.liftweb.sitemap.Loc$class.paramValue(Loc.scala:85)
net.liftweb.sitemap.Menu$ParamMenuable$$anon$9.paramValue(Menu.scala:170)
net.liftweb.sitemap.Loc$$anonfun$currentValue$3.apply(Loc.scala:114)
net.liftweb.sitemap.Loc$$anonfun$currentValue$3.apply(Loc.scala:114)
net.liftweb.common.EmptyBox.or(Box.scala:646)
net.liftweb.sitemap.Loc$class.currentValue(Loc.scala:114)
net.liftweb.sitemap.Menu$ParamMenuable$$anon$9.currentValue(Menu.scala:170)
bootstrap.liftweb.Boot$$anonfun$lift$8.apply(Boot.scala:107)
bootstrap.liftweb.Boot$$anonfun$lift$8.apply(Boot.scala:106)
net.liftweb.util.NamedPF$$anonfun$applyBox$1.apply(NamedPartialFunction.scala:97)
net.liftweb.util.NamedPF$$anonfun$applyBox$1.apply(NamedPartialFunction.scala:97)
net.liftweb.common.Full.map(Box.scala:553)
net.liftweb.util.NamedPF$.applyBox(NamedPartialFunction.scala:97)
net.liftweb.http.LiftRules.snippet(LiftRules.scala:711)
net.liftweb.http.LiftSession$$anonfun$net$liftweb$http$LiftSession$$findSnippetInstance$1.apply(LiftSession.scala:1506)
net.liftweb.http.LiftSession$$anonfun$net$liftweb$http$LiftSession$$findSnippetInstance$1.apply(LiftSession.scala:1506)
net.liftweb.common.EmptyBox.or(Box.scala:646)
net.liftweb.http.LiftSession.net$liftweb$http$LiftSession$$findSnippetInstance(LiftSession.scala:1505)
net.liftweb.http.LiftSession$$anonfun$locateAndCacheSnippet$1$1$$anonfun$apply$88.apply(LiftSession.scala:1670)
net.liftweb.http.LiftSession$$anonfun$locateAndCacheSnippet$1$1$$anonfun$apply$88.apply(LiftSession.scala:1669)

有人知道我哪里出错了吗?我无法在 Menu.param 上找到很多信息。

非常感谢您的帮助。

F

4

1 回答 1

3

我从来没有尝试过你在做什么,所以我不确定完成它的最佳方法。您使用 Loc 参数的方式是从 URL 模式中提取变量。在您的情况下, Item 的字符串表示形式http://server/item/ITEMID在哪里ITEMID,哪个是传递给fetchItem函数的值。如果您只是随意调用函数调用,它将没有值,并且据我所知,您正在请求一个未初始化的值。

我认为有两种可能的解决方案。第一个是使用S.location而不是AnItemPage.menu.currentValue. 它将返回一个Box[Loc[Any]]表示Loc当前正在访问的 (使用参数集)。您可以使用它Loc来检索currentValue和设置参数。

另一种选择是在您的代码段中实例化演员。像这样的东西:

项目.html

   <div data-lift="AnItemPage">
     <div id="mycomet"></div>
   </div>

然后在您的 AnItemPage 片段中,如下所示:

class AnItemPage(item: Item) {
  def render = "#mycomet" #> new AddCometItemPage(item).render 
}

我还没有测试过其中任何一个,所以他们可能需要一些调整。希望它能给你一个大致的想法。

于 2013-02-12T20:46:47.717 回答