我有一些应该返回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/html
和application/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/"
}
答案 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页。