使用Javascript从Window.open中的控制器捕获异常

使用Javascript从Window.open中的控制器捕获异常,javascript,java,ajax,Javascript,Java,Ajax,我有一个控制器,用于刷新字节,inturn将在客户端生成PDF。但是,如果发生异常,我希望捕获该异常并向用户显示一些适当的消息 我尝试了Ajax,但Ajax只使用JSON、字符串或XML作为消息交换格式。我怎样处理这种情况 我必须在成功的情况下生成pdf或捕获异常。这是我的控制器和javascript代码 try { MyUtil.generatePdf(response, documentBytes, "DU"); // --> This method will flush th

我有一个控制器,用于刷新字节,inturn将在客户端生成PDF。但是,如果发生异常,我希望捕获该异常并向用户显示一些适当的消息

我尝试了Ajax,但Ajax只使用JSON、字符串或XML作为消息交换格式。我怎样处理这种情况

我必须在成功的情况下生成pdf或捕获异常。这是我的控制器和javascript代码

try {
    MyUtil.generatePdf(response, documentBytes, "DU"); // --> This method will flush the bytes
} catch (Exception e) {
    result.setStatus("EXCEPTION OCCURED.");
}
return result;
生成pdf方法 Javascript代码
我不认为您可以使用
window.open()
来实现这一点

我的建议是使用ServletAPI,下载PDF,或者在出现错误时向用户显示错误页面

我有一些测试代码,用于编写PDF或向用户发送带有错误消息的错误页面的场景

线索是捕捉到异常,在这种情况下,将使用不同的编码向用户发送错误消息

servlet代码 这很有效。要么下载PDF文件,要么出现错误页面。您最终需要处理错误页面以使其看起来漂亮,但默认的错误页面是一个开始

有时您会看到PDF,如果出现错误,则会显示默认错误页面:


我认为您无法使用
window.open()
实现这一点

我的建议是使用ServletAPI,下载PDF,或者在出现错误时向用户显示错误页面

我有一些测试代码,用于编写PDF或向用户发送带有错误消息的错误页面的场景

线索是捕捉到异常,在这种情况下,将使用不同的编码向用户发送错误消息

servlet代码 这很有效。要么下载PDF文件,要么出现错误页面。您最终需要处理错误页面以使其看起来漂亮,但默认的错误页面是一个开始

有时您会看到PDF,如果出现错误,则会显示默认错误页面:


在您的情况下,最好将pdf响应作为arraybuffer(角度方向)获取,并将其存储为blob,然后下载。您可以通过向服务器发送请求来完成此操作。并在角度代码中添加一个错误块

服务器端代码

    List<PhysicalCountEntityTo> salaryList = exportNonDashBoardReportManager.fetchSalaryDetails(payloadBean);
    HashMap<String, Object> parametersPDF = new HashMap<String, Object>();
    JasperPrint jasperPrint = null;
    JRBeanCollectionDataSource beanCollectionDataSource = null;
    beanCollectionDataSource = new JRBeanCollectionDataSource(salaryList);
    String reportPath = httpServletRequest.getServletContext().getRealPath("//WEB-INF//JasperReports//Salary.jasper");
    jasperPrint = JasperFillManager.fillReport(reportPath, parametersPDF, beanCollectionDataSource);
    httpServletResponse.addHeader("Content-disposition","attachment; filename=Salary.pdf");
    ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();    
    JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
}

重要信息-在请求头中,将响应类型作为“json”添加到“arraybuffer”,否则它将无法工作

fetchPDF(url: string,data): Observable<any> {
this.getCredentials();
const authHeaders = this.createBasicAuthorizationHeader(this.credentials);
 return this.http.post(this.getApiUrl(url),data,{headers: authHeaders,'responseType'  : 'arraybuffer' as 'json'})
 }
fetchPDF(url:string,data):可观察{
这是.getCredentials();
const authHeaders=this.createBasicAuthorizationHeader(this.credentials);
返回this.http.post(this.getApiUrl(url),数据,{headers:authHeaders,'responseType':'arraybuffer'作为'json'})
}

它适用于IE、Mozilla和Crome

在您的情况下,最好将pdf响应作为arraybuffer在angular侧获取,并将其存储为blob,然后下载。您可以通过向服务器发送请求来完成此操作。并在角度代码中添加一个错误块

服务器端代码

    List<PhysicalCountEntityTo> salaryList = exportNonDashBoardReportManager.fetchSalaryDetails(payloadBean);
    HashMap<String, Object> parametersPDF = new HashMap<String, Object>();
    JasperPrint jasperPrint = null;
    JRBeanCollectionDataSource beanCollectionDataSource = null;
    beanCollectionDataSource = new JRBeanCollectionDataSource(salaryList);
    String reportPath = httpServletRequest.getServletContext().getRealPath("//WEB-INF//JasperReports//Salary.jasper");
    jasperPrint = JasperFillManager.fillReport(reportPath, parametersPDF, beanCollectionDataSource);
    httpServletResponse.addHeader("Content-disposition","attachment; filename=Salary.pdf");
    ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();    
    JasperExportManager.exportReportToPdfStream(jasperPrint, servletOutputStream);
}

重要信息-在请求头中,将响应类型作为“json”添加到“arraybuffer”,否则它将无法工作

fetchPDF(url: string,data): Observable<any> {
this.getCredentials();
const authHeaders = this.createBasicAuthorizationHeader(this.credentials);
 return this.http.post(this.getApiUrl(url),data,{headers: authHeaders,'responseType'  : 'arraybuffer' as 'json'})
 }
fetchPDF(url:string,data):可观察{
这是.getCredentials();
const authHeaders=this.createBasicAuthorizationHeader(this.credentials);
返回this.http.post(this.getApiUrl(url),数据,{headers:authHeaders,'responseType':'arraybuffer'作为'json'})
}

它适用于IE、Mozilla和Crome

@情况并非如此,我想捕获异常并自定义消息并在某个模式窗口中显示。@情况并非如此,我想捕获异常并自定义消息并在某个模式窗口中显示。
exportPDF(event){
this.showPageSpinner=true;
this.httpRestClient.fetchPDF("download_salary_report", this.payloadBean).subscribe(
  response => {
    var blob = new Blob([response], {type: 'application/pdf'});
    var ua = window.navigator.userAgent;
    var msie = ua.indexOf('MSIE');
    var trident = ua.indexOf('Trident/');
    var edge = ua.indexOf('Edge/');

  if(msie > 0 || trident > 0 || edge > 0){
    window.navigator.msSaveOrOpenBlob(blob,'Salary.pdf');
}
else if(navigator.userAgent.toLowerCase().indexOf('firefox') > -1){
    var link = document.createElement('a');
    link.href = URL.createObjectURL(blob);
    link.download = "Salary.pdf";
    document.body.appendChild(link);
    link.click();

    window.setTimeout(function() {
      URL.revokeObjectURL(link.href);
      document.body.removeChild(link);
    }, 0);

}
  else{ 

  var link=document.createElement('a');
  link.href=window.URL.createObjectURL(blob);
  link.download="Salary.pdf";
  link.click();


  }
  this.showPageSpinner=false;
    },
  error=>{
  // show your message here

  });
fetchPDF(url: string,data): Observable<any> {
this.getCredentials();
const authHeaders = this.createBasicAuthorizationHeader(this.credentials);
 return this.http.post(this.getApiUrl(url),data,{headers: authHeaders,'responseType'  : 'arraybuffer' as 'json'})
 }