Создать загрузку или показать сообщение об ошибке в Wicket
Я использую следующий код для динамического создания загрузки в Wicket, используя ResourceLink
подход (поскольку загрузка не является статическим файлом, его нужно генерировать на лету, и мне сказали, что это был правильный подход):
IResource res = new AbstractResource() {
@Override
protected ResourceResponse newResourceResponse(Attributes attributes) {
ResourceResponse resourceResponse = new ResourceResponse();
resourceResponse.setContentType("application/pdf");
resourceResponse.setFileName("output.pdf");
resourceResponse.setContentDisposition(ContentDisposition.ATTACHMENT);
resourceResponse.setWriteCallback(new WriteCallback() {
@Override
public void writeData(Attributes attributes) throws IOException {
OutputStream outputStream = attributes.getResponse().getOutputStream();
try {
outputStream.write(generateDocument());
} catch (Exception e) {
//Generation failed... Here I'd like to either show a popup message or alter the current page to show an error somewhere in the page
}
}
});
return resourceResponse;
}
};
ResourceLink<Void> resLink = new ResourceLink<Void>("resLink", res);
myForm.add(resLink);
Комментарий в коде выше показывает, где у меня проблемы. Если генерация загрузки не удалась (что может произойти, если определенные условия не выполняются), я хотел бы показать сообщение об ошибке, либо отобразив всплывающее окно, либо изменив страницу, чтобы отобразить некоторый текст ошибки (но в любом случае я хочу чтобы избежать ухода / перезагрузки всей страницы)
Это возможно?
2 ответа
Вот ссылка с ответом:
https://cwiki.apache.org/confluence/display/WICKET/AJAX+update+and+file+download+in+one+blow
Не забудьте использовать try/catch с ошибкой (e.getMessage()) внутри catch и target.add(feedbackPanel) после перехвата ошибки.
Я не уверен, что это возможно, потому что вам нужно использовать не-Ajax-запрос, чтобы иметь возможность загружать как ATTACHMENT. Но так как это не Ajax-запрос, вам придется либо перезагрузить текущую страницу, либо перенаправить на другую страницу в случае ошибки.