具有ResponseEntity和pdf的HttpStatus

时间:2019-07-12 16:06:42

标签: java spring spring-mvc

我有一个spring mvc控制器,该控制器生成一个“应用程序/ pdf”来下载生成的pdf。我想始终返回pdf,并根据特定条件还返回不同的HTTP代码。

我试图返回ResponseEntity <>对象,但PDF的响应始终为200(总是生成pdf,但我需要不同的状态响应)。

@RequestMapping(value = "/obtain/downloadPDF", method = RequestMethod.GET, produces = "application/pdf")
@ResponseBody
public ResponseEntity<?> getPdfFile(HttpServletResponse response,HttpServletRequest request) throws IOException{

    response.setHeader("Content-disposition", "inline; filename=\"" +"file.pdf" +"\"");
    String error = getPDF(response, request);
    logger.debug("PDF error : " + StringUtils.defaultIfEmpty(error,"null") );
    return new ResponseEntity<>("",HttpStatus.INTERNAL_SERVER_ERROR);
}

注意:在getPDF方法中,只是生成pdf并将其写入到response.getOutputStream()的代码。

我的想法是,我想始终在输出流中返回pdf,但是返回不同的结果代码(200、500等)。返回500时的事件,我想返回PDF。有可能吗?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

对此我不是100%肯定,但是我认为该方法返回的是HttpServletResponse中的内容,而不是您要返回的对象。

我认为您应该尝试使用HttpServletResponse.getWriter().write(responseEntity.getBody())HttpServletResponse.setHttpStatus(responseEntity.getHttpStatus())或仅使用等效的硬编码值...

此外,您是否同时看到错误和200状态?如果是这样,请尝试将实体参数化为字符串-放置在其中的任何Throwable应该仍然可以正常工作。

如果您尝试这样做,请让我知道它是否有效,因此我可以编辑或删除此答案-我实际上还没有尝试过,但是有兴趣了解为什么该代码不起作用。

答案 1 :(得分:0)

理想的方法是在 getPDF()中设置响应状态( response.setStatus(statusCode) ),该响应状态返回字符串消息,您可以将其显示给客户端。现在,您可以使用response.getStatus()来获取状态,并可以向客户端做出响应。您告诉您要下载PDF文件,而不管其中的状态码是什么,下面的代码都一样。但是我认为当某些条件不能满足要求时,您不应退还PDF文件。

由于我不知道要在哪个条件下使用状态500,因此我创建了一个样本,该样本随机生成数字,并根据条件设置响应代码。

@RequestMapping(value = "/obtain/downloadPDF", method = RequestMethod.GET, produces = "application/pdf")
    public ResponseEntity<?> getPdfFile(HttpServletResponse response,HttpServletRequest request) throws IOException{

        response.setHeader("Content-disposition", "inline; filename=\"" +"file.pdf" +"\"");
        String message = getPDF(response, request);
        System.out.println("statusCodeString: "+message + "Status: "+response.getStatus());

        return new ResponseEntity<>(message,(response.getStatus() == 500 ? HttpStatus.INTERNAL_SERVER_ERROR : HttpStatus.OK));
    }

    private String getPDF(HttpServletResponse response, HttpServletRequest request) {
        int min = 0;
        int max = 10;
        int num = (int) min + (int)(Math.random() * ((max - min) + 1));
        System.out.println("Number: "+num);
        if(num<=5)
        {
            response.setStatus(200);
            return "200 <message for 200>";
        }
        else
        {
            response.setStatus(500);
            return "500 <message for 500>";
        }       
    }