1

在我的项目中,有其他(非检票口)应用程序需要知道某些域对象的 URL 表示(例如,为了将链接写入http://mydomain.com/user/someUserName/通知电子邮件)。

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

我一直在网上和通过检票口来源跟踪一个完整的工作日,并且没有找到一种方法来检索没有当前 RequestCycle 的给定 PageClass 和 PageParameters 的 URL。

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

4

1 回答 1

2

更新:因为下面的代码在某些情况下会导致问题(在我们的例子中,是由 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);

原解决方案如下:

在深入研究了检票口来源的内容后,我能够将这段代码粘合在一起

IRequestMapper rm = MyWebApplication.get().getRootRequestMapper();
IRequestHandler handler = new BookmarkablePageRequestHandler(new PageProvider(pageClass, parameters));
Url url = rm.mapHandler(handler);

它可以在没有 current 的情况下工作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 回答