Java 在Wicket中生成下载或显示错误消息

Java 在Wicket中生成下载或显示错误消息,java,wicket,wicket-6,Java,Wicket,Wicket 6,我正在使用以下代码在Wicket中使用ResourceLink方法动态生成下载(因为下载不是静态文件,需要动态生成,我被告知这是正确的方法): IResource res=new AbstractResource(){ @凌驾 受保护的ResourceResponse newResourceResponse(属性){ ResourceResponse ResourceResponse=新的ResourceResponse(); resourceResponse.setContentType(“a

我正在使用以下代码在Wicket中使用
ResourceLink
方法动态生成下载(因为下载不是静态文件,需要动态生成,我被告知这是正确的方法):

IResource res=new AbstractResource(){
@凌驾
受保护的ResourceResponse newResourceResponse(属性){
ResourceResponse ResourceResponse=新的ResourceResponse();
resourceResponse.setContentType(“application/pdf”);
setFileName(“output.pdf”);
setContentDisposition(ContentDisposition.ATTACHMENT);
setWriteCallback(new WriteCallback()){
@凌驾
公共void writeData(属性)引发IOException{
OutputStream OutputStream=attributes.getResponse().getOutputStream();
试一试{
write(generateDocument());
}捕获(例外e){
//生成失败…这里我想显示一条弹出消息或更改当前页面以显示页面中的某个错误
}                       
}
});
返回资源响应;
}   
};
ResourceLink resLink=新的ResourceLink(“resLink”,res);
myForm.add(resLink);
上面代码中的注释显示了我遇到的问题。如果下载的生成失败(如果不满足某些条件,可能会发生这种情况),我希望显示一条错误消息,可以显示弹出窗口,也可以更改页面以显示一些错误文本(但无论哪种情况,我都希望避免离开/重新加载整个页面)


这可能吗

我不确定这是否可行,因为您需要使用非Ajax请求才能作为附件下载。但由于它是非Ajax请求,您需要重新加载当前页面或在出现错误时重定向到另一页面。

我不确定这是否可行,因为您需要使用非Ajax请求才能作为附件下载。但由于这是非Ajax请求,您需要重新加载当前页面,或者在出现错误时重定向到另一个页面。

以下是带有答案的链接:


不要忘记在catch和目标中使用带有错误的try/catch(e.getMessage())。捕获错误后添加(feedbackPanel)。

以下是答案链接:


不要忘记在catch和目标中使用带有错误的try/catch(例如getMessage())。捕获错误后添加(feedbackPanel)。

另一种方法如何?我可以使用Ajax组件动态生成下载吗?有关此信息,请参阅:。但在我看来,这对您的用例也不起作用,因为不可能在Ajax响应中流式传输二进制数据,而且它可以使用重定向?我可以使用Ajax组件动态生成下载吗?有关此信息,请参阅:。但在我看来,这对您的用例也不起作用,因为不可能在Ajax响应中流式传输二进制数据,而且它可以使用重定向。
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);