Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “清除导叶”;“缓存”/&引用;“上下文”在Wicket中重新加载Spring上下文_Java_Spring_Wicket - Fatal编程技术网

Java “清除导叶”;“缓存”/&引用;“上下文”在Wicket中重新加载Spring上下文

Java “清除导叶”;“缓存”/&引用;“上下文”在Wicket中重新加载Spring上下文,java,spring,wicket,Java,Spring,Wicket,我有一个wicket web应用程序,它可以挂载一个页面,允许用户选择应用程序应该在什么“模式”下启动,即用于开发目的的模拟和用于测试/QA/prod环境的生产。显然,这只是一个用于开发目的的特性。无论如何,挂载页面只是以单选按钮的形式向用户提供了两个选项。后端代码完全重新加载Spring应用程序上下文,允许我们根据需要选择一组不同的bean。例如,在选择mockspring概要文件时,我们缺少很多安全性和缓存bean 这似乎工作得很好,但问题似乎是,虽然Spring重新加载时没有任何问题,但W

我有一个wicket web应用程序,它可以挂载一个页面,允许用户选择应用程序应该在什么“模式”下启动,即用于开发目的的模拟和用于测试/QA/prod环境的生产。显然,这只是一个用于开发目的的特性。无论如何,挂载页面只是以单选按钮的形式向用户提供了两个选项。后端代码完全重新加载Spring应用程序上下文,允许我们根据需要选择一组不同的bean。例如,在选择mockspring概要文件时,我们缺少很多安全性和缓存bean

这似乎工作得很好,但问题似乎是,虽然Spring重新加载时没有任何问题,但Wicket没有。它以某种方式缓存旧bean,以便发生以下情况。首先,考虑这段测试代码:

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的开发环境中本地工作

任何和所有想法都是非常受欢迎的:)

问题似乎是这个类:Quote:“这个类还将缓存任何生成的代理,以便始终为相同的spring依赖返回相同的代理。”这解释了为什么wicket使用“旧bean”,即使spring上下文被刷新。该类由SpringComponentInjector使用。因此,我们不希望改变它的工作方式,因为这样做会对我们的生产代码造成严重影响(不在生产中缓存bean是不好的)。