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