Java “清除导叶”;“缓存”/&引用;“上下文”在Wicket中重新加载Spring上下文
我有一个wicket web应用程序,它可以挂载一个页面,允许用户选择应用程序应该在什么“模式”下启动,即用于开发目的的模拟和用于测试/QA/prod环境的生产。显然,这只是一个用于开发目的的特性。无论如何,挂载页面只是以单选按钮的形式向用户提供了两个选项。后端代码完全重新加载Spring应用程序上下文,允许我们根据需要选择一组不同的bean。例如,在选择mockspring概要文件时,我们缺少很多安全性和缓存bean 这似乎工作得很好,但问题似乎是,虽然Spring重新加载时没有任何问题,但Wicket没有。它以某种方式缓存旧bean,以便发生以下情况。首先,考虑这段测试代码:Java “清除导叶”;“缓存”/&引用;“上下文”在Wicket中重新加载Spring上下文,java,spring,wicket,Java,Spring,Wicket,我有一个wicket web应用程序,它可以挂载一个页面,允许用户选择应用程序应该在什么“模式”下启动,即用于开发目的的模拟和用于测试/QA/prod环境的生产。显然,这只是一个用于开发目的的特性。无论如何,挂载页面只是以单选按钮的形式向用户提供了两个选项。后端代码完全重新加载Spring应用程序上下文,允许我们根据需要选择一组不同的bean。例如,在选择mockspring概要文件时,我们缺少很多安全性和缓存bean 这似乎工作得很好,但问题似乎是,虽然Spring重新加载时没有任何问题,但W
public class MyPage extends Page {
@Inject
MyBean myBean;
public MyPage() {
super("id");
myBean.getData();
}
两组可用的Springbeans都声明MyBean:mock在调用getData时返回静态数据,而生产将调用转发给WebService端点,并进行一些过滤等
发生的情况如下:如果应用程序启动,并且您从单选按钮页面选择mock profile,则会读取模拟数据。但是,返回单选按钮页面并选择生产配置文件会向我们显示问题:
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()之类的东西,但到目前为止,我们尝试的似乎都不起作用
- 重新启动整个Web应用程序,例如使用环境属性作为解决方法。这种方法的问题是在不知道我们运行的是哪台服务器的情况下以编程方式重新启动应用程序,也就是说,我们希望它在运行Jetty的地方以及在应用程序运行JBoss的开发环境中本地工作