我有以下托管bean。但每次我回到同一个bean的帖子,即在调用updateFileList时。我得到了一个新的FileDAO实例。
我该怎样防止这种情况? 在托管bean中使用DAO是否安全,如果不是我可以做出哪些更改来改善它。
@ManagedBean(name = "file") @ViewScoped public class FileController implements Serializable { private static final long serialVersionUID = 1L; private List<LoadFileLog> fileList = null; private Date selectedDate; FileDAO fileDAO; public FileController() { System.out.println(" In file Controller constructor"); ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext(); ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext); fileDAO = (FileDAO) context.getBean("FileDAO"); } public FileDAO getFileDAO() { return fileDAO; } public void setFileDAO(FileDAO fileDAO) { this.fileDAO = fileDAO; } public List<LoadFileLog> getFileList() { return fileList; } public Date getSelectedDate() { return selectedDate; } public void setSelectedDate(Date selectedDate) { this.selectedDate = selectedDate; } public void updateFileList() { SystemController systemControl = (SystemController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("system"); List systemList = new ArrayList(); if (systemControl != null) { systemControl.populateSelectedSystems(); systemList = systemControl.getSelectedSysIdList(); } if (selectedDate != null) { fileList = getFileDAO().getFiles(systemList, selectedDate); } } }
谢谢!
答案 0 :(得分:5)
通常不应在回发上重新创建视图范围的JSF托管bean。
然而,这将在特定情况下发生,所有这些都与Mojarra issue 1492中描述的鸡蛋问题有关(顺便提一下,即将推出的Mojarra 2.2)。当您将标记处理程序(如JSTL <c:forEach>
)的属性绑定到视图范围bean的属性时,或者当您将JSF组件binding
用于属性时,将重新创建视图范围的bean。查看scoped bean。解决方案是使用JSF组件而不是JSTL标记,并避免在范围比请求范围更广的bean上使用binding
。
答案 1 :(得分:0)
fileDAO的bean范围是什么?
最好让spring注入依赖,而不从servlet获取应用程序上下文,然后从中检索bean。