我观察到我在下面描述的requestScoped bean在单个请求期间被多次创建。根据日志的说法,每次重新实例化bean时,就在不久之前,bean被销毁了。
@ManagedBean(name="namesDirectory")
@RequestScoped
public class NamesDirectory {
public static NamesDirectory getCurrentInstance(){
FacesContext context = FacesContext.getCurrentInstance();
return context.getApplication().evaluateExpressionGet(context, "#{namesDirectory}", NamesDirectory.class);
}
@PostConstruct
public void foo(){
Easy.log("bean created");
}
@PreDestroy
public void foo1(){
Easy.log("bean destroyed");
}
}
在单个请求的所有处理完成之前,bean被销毁的原因是什么?我如何照顾不让这件事发生?
我在facelets代码中的某些地方<p:graphicImage url="#" />
导致多次触发请求。删除这些后,我仍然看到这个请求已经创建,但只是两次以前它已经多次了。
实际上我在尝试登录我的应用程序时看到了这一点。因此,在提供凭证之后&amp;他们经过验证,豆子被实例化了。使用但是在此之后用户被移动到成功的登录页面&amp;在构建中再次需要bean时,因此它是不存在的。这会导致这个请求范围的bean被创建2次,因为我认为,这只是一个请求。
答案 0 :(得分:1)
您的登录信息可能会将浏览器重定向到带有Location:
标题的新页面,这很正常。所以你应该期待两个请求,因此需要两个请求范围的bean。同样,正如您所注意到的,链接的图像会导致另一个浏这就是网络的运作方式。如果它困扰你那么多,你可以使用不同的范围(例如会话,每个登录用户一个bean),但要注意选项卡式浏览。