如何从PageClass和PageParameters中获取wicket URL而无需运行wicket应用程序(即无RequestCycle)?

如何从PageClass和PageParameters中获取wicket URL而无需运行wicket应用程序(即无RequestCycle)?,wicket,mount,Wicket,Mount,在我的项目中,还有其他(非wicket)应用程序,它们需要知道一些域对象的URL表示(例如,为了编写类似http://mydomain.com/user/someUserName/,并发送到通知电子邮件中) 现在我想在我的wicket模块中创建一个Springbean,在没有运行wicket上下文的情况下公开我需要的URL,以便使其他应用程序依赖于wicket模块,例如提供一个方法公共字符串getUrlForUser(User u)返回“/User/someUserName/” 我已经在网络和w

在我的项目中,还有其他(非wicket)应用程序,它们需要知道一些域对象的URL表示(例如,为了编写类似
http://mydomain.com/user/someUserName/
,并发送到通知电子邮件中)

现在我想在我的wicket模块中创建一个Springbean,在没有运行wicket上下文的情况下公开我需要的URL,以便使其他应用程序依赖于wicket模块,例如提供一个方法
公共字符串getUrlForUser(User u)
返回
“/User/someUserName/”

我已经在网络和wicket源代码中搜索了整整一天,没有找到一种方法来检索给定PageClass和PageParameters的URL,而没有当前的RequestCycle


有什么办法可以做到这一点吗?实际上,我需要的所有信息都以某种方式存储在我的
WebApplication
中,我在其中定义了装入点和页面类。

更新:,因为下面的代码在某些情况下会导致问题(在我们的情况下,由quarz计划的作业随后执行),我潜得更深一点,终于找到了一个更轻的解决方案

优点:

  • 无需构造和运行WebApplication的实例
  • 无需模拟ServletContext
  • 工作完全独立于web应用程序容器
相反(或否,取决于你如何看待它):

  • 需要从WebApplication类中提取实际装载并将其封装在另一个类中,然后独立进程可以使用该类。您不能再使用WebApplication方便的
    mountPage()
    方法,但您可以轻松构建自己的方便实现,只需查看wicket源代码即可
(就我个人而言,我从未对占我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);
它不需要当前的
RequestCycle
,但仍然需要运行
MyWebApplication

然而,从Wicket的内部测试类中,我将以下内容组合在一起,以构建
MyWebApplication
的虚拟实例:

MyWebApplication dummy = new MyWebApplication();
dummy.setName("test-app");
dummy.setServletContext(new MockServletContext(dummy, ""));
ThreadContext.setApplication(dummy);
dummy.initApplication();

和你需要的足够相似吗?谢谢,但不,一点也不。我需要的是URL,而不是呈现的标记。
MyWebApplication dummy = new MyWebApplication();
dummy.setName("test-app");
dummy.setServletContext(new MockServletContext(dummy, ""));
ThreadContext.setApplication(dummy);
dummy.initApplication();