更新:以下のコードは特定の状況下で問題を引き起こしたため (私たちの場合、quarz スケジュールされたジョブによって後で実行されました)、もう少し深く掘り下げて、最終的により軽量な解決策を見つけました。
長所:
- WebApplication のインスタンスを構築して実行する必要はありません
- ServletContext をモックする必要はありません
- Web アプリケーション コンテナから完全に独立して動作
反対(またはそうでないかは、見方によって異なります):
- WebApplication クラスから実際のマウントを抽出し、それを別のクラスにカプセル化する必要があります。これは、スタンドアロン プロセスで使用できます。その場合、 WebApplication の便利なメソッドは使用できなくなります
mountPage()
が、独自の便利な実装を簡単に構築できます。ウィケットのソースを確認するだけです。
(個人的には、WebApplication クラスの 95% を構成するすべてのマウント構成に満足したことがないので、最終的に別の場所に抽出できて良かったと思います。)
実際のコードを投稿することはできませんが、このコードを見れば、ページをマウントする方法と、後で URL を取得する方法がわかります。
CompoundRequestMapper rm = new CompoundRequestMapper();
// mounting the pages
rm.add(new MountedMapper("mypage",MyPage.class));
// ... mount other pages ...
// create URL from page class and parameters
Class<? extends IRequestablePage> pageClass = MyPage.class;
PageParameters pp = new PageParameters();
pp.add("param1","value1");
IRequestHandler handler = new BookmarkablePageRequestHandler(new PageProvider(MyPage.class, pp));
Url url = rm.mapHandler(handler);
以下の元のソリューション:
改札のソースの中身を深く掘り下げた後、このコード片を接着することができました
IRequestMapper rm = MyWebApplication.get().getRootRequestMapper();
IRequestHandler handler = new BookmarkablePageRequestHandler(new PageProvider(pageClass, parameters));
Url url = rm.mapHandler(handler);
現在RequestCycle
の がなくても動作しますが、実行する必要がありMyWebApplication
ます。
ただし、Wicket の内部テスト クラスから、次のものをまとめて のダミー インスタンスを作成しましたMyWebApplication
。
MyWebApplication dummy = new MyWebApplication();
dummy.setName("test-app");
dummy.setServletContext(new MockServletContext(dummy, ""));
ThreadContext.setApplication(dummy);
dummy.initApplication();