我有一个安装页面的 wicket Web 应用程序,允许用户选择应用程序应该启动的“模式”,即模拟用于开发目的和生产用于测试/QA/prod 环境。显然,这只是一个将用于开发目的的功能。无论如何,已安装的页面只是以单选按钮的形式向用户展示了 2 个选项。后端代码完全重新加载 Spring Application Context,允许我们根据需要选择不同的 bean 集。例如,在选择 mock spring 配置文件时,我们缺少很多安全和缓存 bean。
这似乎工作正常,但问题似乎是,虽然 Spring 重新加载没有任何问题,但 Wicket 没有。它以某种方式缓存旧 bean,以便发生以下情况。首先,考虑这段测试代码:
public class MyPage extends Page {
@Inject
MyBean myBean;
public MyPage() {
super("id");
myBean.getData();
}
两组可用的 Springbean 都声明了 MyBean:当调用 getData 时,mock 返回静态数据,而生产将调用转发到 WebService 端点,进行一些过滤等。
发生的情况如下:如果应用程序启动并且您从单选按钮页面选择模拟配置文件,则会读取模拟数据。然而,回到单选按钮页面并选择生产配置文件向我们展示了问题:
WebApplication.get().getApplicationContext().getBean("myBean"); //returns the production instance
//Debugging the myBean instance in myPage shows it to be the mock instance
因此,尽管 Spring 刷新良好,删除旧 bean 并创建新集合,但 Wicket 使用旧 bean 版本。我们如何解决这个问题?我们考虑的两个选项如下:
刷新“检票口中的所有内容”。不确定我们将如何解决这个问题,因为我不太了解它的魔力。原则上,我们想要做的是 WebApplication.get().refreshApplicationContext() 或 Session.clean() 或类似的东西,但到目前为止我们尝试过的任何东西似乎都不起作用。
重新启动整个 WebApplication,例如使用环境属性作为解决方法。这种方法的问题是在不知道我们在哪个服务器上运行的情况下以编程方式重新启动应用程序,即我们希望它在我们运行 Jetty 的本地和应用程序在 JBoss 上运行的开发环境中工作。
任何和所有的想法都非常受欢迎:)