1

名前付きコメットを作成するために使用できるように、スニペット内の Lift Menu.param からパラメーターを抽出しようとしています。ただし、ここで提案されているように、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)) 
  }

}

サイトマップにメニューを追加しました。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 に関する多くの情報を見つけることができませんでした。

ご助力ありがとうございます。

4

1 に答える 1

3

私はあなたがやっていることを試したことがないので、それを達成するための最良の方法はわかりません. Loc Param を使用している方法では、URL パターンから変数を抽出しています。あなたの場合、http://server/item/ITEMIDITEMIDItem の文字列表現であり、 which は関数に渡される値ですfetchItem。関数呼び出しは、任意に呼び出すだけでは値がありません。初期化されていない値を要求していることがわかります。

考えられる解決策は2つあると思います。最初は のS.location代わりに使用することですAnItemPage.menu.currentValue。これは、現在アクセスされている (パラメーターが設定された) をBox[Loc[Any]]表すを返します。Locそれを使用しLocて、パラメーターを取得currentValueおよび設定できます。

もう 1 つのオプションは、スニペットでアクターをインスタンス化することです。このようなもの:

item.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 に答える