Ошибка загрузки файла с помощью диалога p: - PullRequest
0 голосов
/ 31 мая 2018

У меня есть ap: commandLink, который вызывает метод bean и загружает файл с помощью сервлета Faces.Он работает нормально, пока я не добавлю ap: dialog на моей странице (commandLink не находится внутри него)

<p:commandLink value="#{file}"
    actionListener="#{bean.download(file)}"
    ajax="false"
    immediate="true"
    process="@this"/>

Игнорируя это, process="@this" commandLink пытается обработать переменную fileName в диалоге

<p:dialog header="Edit" 
          widgetVar="editDialog" 
          modal="true">
        <div>
            <p:panelGrid>
                <p:row style="height: 50px;">
                    <p:column>
                        <p:inputText
                            value="#{bean.fileName}"
                            validator="#{fileName.validate}"
                            requiredMessage="file name is not filled"
                            validatorMessage="file with this name already exists"/>
                    </p:column>
                </p:row>
            </p:panelGrid>
        </div>
</p:dialog>

И у меня есть исключение:

javax.el.PropertyNotFoundException:value="#{bean.fileName}": Target Unreachable, 'null' returned null

Я не могу включить ajax, потому что в этом случае файл не будет загружен

Backend:

public void download(InputStream is, String fileName) {
    ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
    context.setResponseContentType(context.getMimeType(fileName));
    context.setResponseHeader("Content-Disposition", "attachement;filename=" + fileName);
    try (OutputStream os = context.getResponseOutputStream()) {
        while(is.available() > 0) {
            os.write(is.read());
        }
    }
    catch(IOException ex) {
        LOG.error(ex);
    }
    finally {
        FacesContext.getCurrentInstance().responseComplete();
    }
}

Как я могу это исправить?Без диалога все отлично работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...