@ViewScoped在每次回发时创建新实例

时间:2012-01-04 14:24:31

标签: jsf jsf-2 postback view-scope

我有以下托管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);
        }
    }

}

谢谢!

2 个答案:

答案 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。