2

我有以下托管 bean。但是每次我在调用updateFileList 时回帖到同一个bean 时。我得到了一个新的 FileDAO 实例。

我怎样才能防止这种情况?在托管 bean 中拥有 DAO 是否安全,如果不是,我可以进行哪些更改来改进它。

@ManagedBean(name = "文件")
@ViewScoped
公共类 FileController 实现 Serializable {

    私有静态最终长序列版本UID = 1L;

    私有列表<LoadFileLog> fileList = null;
    私人日期 selectedDate;
    FileDAO 文件DAO;

    公共文件控制器(){

        System.out.println("文件控制器构造函数");
        ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        ApplicationContext 上下文 = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
        fileDAO = (FileDAO) context.getBean("FileDAO");


    }


    公共 FileDAO getFileDAO() {
        返回文件DAO;
    }





    公共无效 setFileDAO(FileDAO 文件DAO){
        this.fileDAO = fileDAO;
    }





    公共列表<LoadFileLog> getFileList() {

        返回文件列表;

    }

    公共日期 getSelectedDate() {
        返回选定日期;
    }

    公共无效 setSelectedDate(日期选择日期){
        this.selectedDate = selectedDate;
    }

    公共无效更新文件列表(){

        SystemController systemControl = (SystemController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("system");
        列表 systemList = new ArrayList();

        如果(系统控制!= null){
            systemControl.populateSelectedSystems();
            systemList = systemControl.getSelectedSysIdList();
        }

        if (selectedDate != null) {
            fileList = getFileDAO().getFiles(systemList, selectedDate);
        }
    }

}

谢谢!

4

2 回答 2

5

视图范围的 JSF 托管 bean 通常根本不应该在回发时重新创建。

然而,这将在特定情况下发生,所有这些都与Mojarra 问题 1492中描述的鸡蛋问题有关(顺便说一下,即将推出的 Mojarra 2.2 已修复)。当您将标记处理程序(如 JSTL)的属性绑定<c:forEach>到视图范围 bean 的属性时,或者当您使用 JSF 组件binding到视图范围 bean 的属性时,将重新创建视图范围 bean。解决方案是使用 JSF 组件而不是 JSTL 标记,并避免binding在比请求范围更广的 bean 上使用。

也可以看看

于 2012-01-04T15:21:51.377 回答
0

fileDAO 的 bean 范围是什么?

最好在不从 servlet 1 获取应用程序上下文然后从中检索 bean 的情况下让 spring 注入该依赖项。

于 2012-01-04T14:47:31.573 回答