抛出异常时的默认内容类型

时间:2018-02-03 00:51:42

标签: java spring exception

我有一些应该返回Word docx文档的控制器方法:

@RequestMapping(method = RequestMethod.GET, produces = "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
@ResponseBody
public ResponseEntity<Resource> getFile() {
    Resource file = storageService.loadTemplateResource();
    return ResponseEntity.ok()
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getFilename() + "\"")
            .body(file);
}

当找到文件时一切正常,但是当storageService.loadTemplateResource()抛出异常时它会产生空体。

如果抛出异常(text/htmlapplication/json),我怎样才能获得Sprng默认内容类型?

编辑:

当我从produces = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"注释中删除@RequestMapping时,我会得到默认的Spring错误resposne:

text / html的:

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.  
Tue Feb 06 16:22:51 CET 2018  
There was an unexpected error (type=Not Found, status=404).  
No message available

或application / json:

{
  "timestamp" : "2018-02-06T15:27:18.881+0000",
  "status" : 404,
  "error" : "Not Found",
  "message" : "No message available",
  "path" : "/api/"
}

1 个答案:

答案 0 :(得分:0)

抛出异常时您想要显示什么?

无论如何,您需要为控制器添加一个异常处理程序,用于异常,如果抛出异常,您的方法将抛出异常处理逻辑

@ExceptionHandler(Exception.class) // Exception/Throwable class you like to catch
@ResponseBody
public ResponseEntity<String> handleException(HttpServletRequest request, Exception ex) {
    return ResponseEntity.badRequest()
            .header(HttpHeaders.CONTENT_TYPE, MediaType.TEXT_HTML_VALUE) // Change or skip this depending on the response you want to build
            .body("Response which you wanted to show");
}

或者只返回不带@ResponseBody的模板名称,并使用像JSP / Thymeleaf这样的模板引擎来构建响应,而不是手动构建响应。

编辑:

Spring启动应该将任何RuntimeExceptions转换为HTTP 500(内部服务器错误),因此您还应该看到抛出任何运行时异常的whitelabel错误页面。你确定你的loadTemplateResource方法实际上抛出异常而不是返回 null 资源对象吗?

您可以通过在控制器方法中通过throw new RuntimeException()手动抛出异常进行测试,并检查是否看到whitelabel错误页面或空白页面。您使用的是哪个Spring版本的btw?

如果您想要404而不是500,您可以创建一个新的Exception类,如下所示,然后抛出它。

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends RuntimeException {
}

关于你的编辑: 您在编辑中看到错误消息的原因不是由于loadTemplateResource中的异常,而是因为当DispatcherServlet找不到请求的处理程序时,它会发送404响应并且因为错误映射没有它会显示白标404页。