1

私のプロジェクトには、いくつかのドメイン オブジェクトの URL 表現を知る必要がある追加の (ウィケットではない) アプリケーションがあります (たとえばhttp://mydomain.com/user/someUserName/、通知メールにリンクを書き込むためなど)。

public String getUrlForUser(User u)ここで、ウィケット モジュールで Spring Bean を作成し、ウィケット コンテキストを実行せずに必要な URL を公開して、他のアプリケーションがウィケットモジュールに依存するようにします"/user/someUserName/"

私は今、Web やウィケット ソースを 1 日中探し回っていますが、現在の RequestCycle なしで特定の PageClass と PageParameters の URL を取得する方法を見つけられませんでした。

これを達成する方法はありますか?WebApplication実際、私が必要とするすべての情報は、マウント ポイントとページ クラスを定義するmy に何とか格納されています。

4

1 に答える 1

2

更新:以下のコードは特定の状況下で問題を引き起こしたため (私たちの場合、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();
于 2012-10-26T13:45:11.600 に答える