0

ビュー スコープ Bean 内に単純なアップロード リスナーがあり、アップロードされたファイルごとにリストに追加され、リストが表示されます。
問題は、アップロード ボタンを押して一度に複数のファイルをアップロードすると、ファイルの 1 つだけがリストに追加され、例外が表示されないことです。一方、前のファイルが完了するのを待って単一のファイルのアップロードを行うと、動作は正常です。
並行性の問題を考えましたが、Bean をセッション スコープに入れようとすると、正しく機能しました。並行性の問題によってビューが無効になる可能性はありますか?
他の提案はありますか?どうもありがとう

<h:form id="form" enctype="multipart/form-data">

    <p:wizard widgetVar="wiz" render="true" id="wizard">

        <p:tab id="p0" title="file upload" step="0">
            <p:panel>
                <p:fileUpload
                    fileUploadListener="#{myBean.uploadedFile}"
                     mode="advanced" multiple="true" sizeLimit="100000" 
                     update="fileList"/>

                <p:dataList id="fileList" value="#{myBean.filesName}" var="file">#{file}</p:dataList>

豆:

public void uploadedFile(FileUploadEvent event) { 

    try {
        files.add(event.getFile());

        filesName.add(event.getFile().getFileName());

    } catch (Exception e) {

        e.printStackTrace();
    }

}
4

1 に答える 1

2

私はちょうどあなたと同じ状況で立ち往生しています. 懸命にデバッグした後、私はついにあなたにも役立つ解決策を見つけました。

この問題は、セッション コンテキストの管理における ViewScoped スコープに起因すると思います。そのため、セッション コンテキストを自分で管理しようとします。このコードを使用して、セッションとリストを初期化します。

    FacesContext context = FacesContext.getCurrentInstance();
    HttpSession session = (HttpSession) context.getExternalContext().getSession(true); 
    session.setAttribute("files", new ArrayList<UploadedFile>());

リストを初期化する必要があります。これは必須です。次に、handleFileUpload メソッドで、セッション コンテキストに保存された属性「ファイル」を使用して、アップロード ファイルを保持します。これで、メソッドで複数のアップロード ファイルを処理できるようになります。

于 2013-12-18T08:19:08.227 に答える