2

私は以下のマネージドBeanを持っています。しかし、同じ Bean にポストバックするたびに、つまり updateFileList を呼び出しています。FileDAO の新しいインスタンスを取得します。

どうすればこれを防ぐことができますか? マネージド Bean 内に DAO を配置することは安全ですか。

@ManagedBean(name = "ファイル")
@ViewScoped
public class FileController は Serializable を実装します {

    private static final long serialVersionUID = 1L;

    プライベート List<LoadFileLog> fileList = null;
    プライベート日付 selectedDate;
    FileDAO fileDAO;

    public FileController() {

        System.out.println(" In file Controller コンストラクター");
        ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        ApplicationContext コンテキスト = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
        fileDAO = (FileDAO) context.getBean("FileDAO");


    }


    public FileDAO getFileDAO() {
        fileDAO を返します。
    }





    public void setFileDAO(FileDAO fileDAO) {
        this.fileDAO = fileDAO;
    }





    public List<LoadFileLog> getFileList() {

        fileList を返します。

    }

    公開日 getSelectedDate() {
        selectedDate を返します。
    }

    public void setSelectedDate(選択した日付の日付) {
        this.selectedDate = selectedDate;
    }

    public void updateFileList() {

        SystemController systemControl = (SystemController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("system");
        リスト systemList = new ArrayList();

        if (systemControl != null) {
            systemControl.populateSelectedSystems();
            systemList = systemControl.getSelectedSysIdList();
        }

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

}

ありがとう!

4

2 に答える 2

5

ビュー スコープの JSF マネージド Bean は、通常、ポストバックで再作成するべきではありません。

ただし、これは特定の状況で発生します。これらはすべて、 Mojarra issue 1492で説明されている鶏卵の問題に関連しています(ちなみに、次の Mojarra 2.2 で修正されています)。ビュー スコープ Bean は、JSTL などのタグ ハンドラーの属性を<c:forEach>ビュー スコープ Bean のプロパティにバインドする場合、または JSF コンポーネントbindingをビュー スコープ Bean のプロパティに使用する場合に再作成されます。binding解決策は、JSTL タグの代わりに JSF コンポーネントを使用し、リクエスト スコープよりも広いスコープの Bean での使用を避けることです。

こちらもご覧ください

于 2012-01-04T15:21:51.377 に答える
0

fileDAO の bean スコープとは何ですか?

サーブレット 1 からアプリケーション コンテキストを取得せずに、その依存関係を Spring に注入してから、そこから Bean を取得する方がよいでしょう。

于 2012-01-04T14:47:31.573 に答える