@ViewScoped создает новый экземпляр при каждой обратной передаче - PullRequest
2 голосов
/ 04 января 2012

У меня нижеуказанный управляемый боб. Но каждый раз, когда я делаю пост обратно к одному и тому же компоненту, т.е. при вызове updateFileList. Я получил новый экземпляр FileDAO.

Как я могу предотвратить это? Безопасно ли иметь 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 ]

5 голосов
/ 04 января 2012

Управляемый компонент JSF с областью представления обычно вообще не должен создаваться на обратных передачах.

Это, однако, произойдет в определенных обстоятельствах, связанных с проблемой куриного яйца, как описано в Выпуск Mojarra 1492 (который, кстати, исправлен для предстоящей Mojarra 2.2). Бин области видимости воссоздается, когда вы связываете атрибуты обработчиков тегов, таких как JSTL <c:forEach>, со свойством бина области видимости или когда вы используете компонент JSF binding со свойством бина области видимости. Решение состоит в том, чтобы использовать компоненты JSF вместо тегов JSTL и избегать использования binding в bean-компоненте более широкой области видимости, чем область запроса.

Смотри также

0 голосов
/ 04 января 2012

Что такое область действия bean-компонента fileDAO?

Было бы лучше заставить Spring внедрить эту зависимость, не получая контекст приложения из сервлета один, а затем извлекая из него бин.

...