我有一个wicket Web应用程序,它安装了一个页面,允许用户选择应用程序应该从哪个“模式”开始,即模拟开发目的和生产测试/ QA / prod环境。显然,这只是一个将用于开发目的的功能。无论如何,安装页面只是以单选按钮的形式向用户提供2个选项。后端代码完全重新加载Spring Application Context,允许我们根据需要选择不同的bean集。例如,在选择模拟弹簧配置文件时,我们缺少很多安全性和缓存bean。
这似乎工作正常,但问题似乎是,虽然Spring重新加载没有任何问题,Wicket没有。它以某种方式缓存旧bean,以便发生以下情况。首先,考虑一下这段测试代码:
public class MyPage extends Page {
@Inject
MyBean myBean;
public MyPage() {
super("id");
myBean.getData();
}
两个可用的Springbeans集都声明MyBean:mock在调用getData时返回静态数据,而production将调用转发到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版本。我们如何解决这个问题?我们考虑的两个选项如下:
刷新“wicket中的所有内容”。不确定我们如何做到这一点,因为我不太清楚它的魔力。原则上,我们想要做的是WebApplication.get()。refreshApplicationContext()或Session.clean()或类似的东西,但到目前为止我们所做的一切似乎都没有用。
重新启动整个WebApplication,例如使用环境作为解决方法。这种方法的问题是以编程方式重新启动应用程序而不知道我们正在运行什么服务器,即我们希望它在我们运行Jetty的本地工作以及应用程序在JBoss上运行的开发环境中工作。
非常欢迎任何和所有想法:)