我正在为移动应用编写服务器端REST应用程序。我一直在尝试设置一个异常处理程序,它遵循解释here,而不是显示一些HTTP错误页面,客户端会收到一个类似于这个的JSON对象:
{
"status": 404,
"code": 40483,
"message": "Oops! It looks like that file does not exist.",
"developerMessage": "File resource for path /uploads/foobar.txt does not exist. Please wait 10 minutes until the upload batch completes before checking again.",
"moreInfo": "http://www.mycompany.com/errors/40483"
}
我已经在指南中详细说明了我的异常,它们似乎运行良好(自定义错误显示在控制台中)。但是我被困在this点,因为我不知道我应该把豆配置放在哪里。
鉴于我拥有所有异常处理程序,解析程序等,我认为我会尝试以不同的方式解决它。此时,当我输入无效的HTTP请求时,我仍然会收到Spring的Whitelabel错误页面,但这次是我的异常的自定义错误消息。所以我想如果我尝试按照here解释实现我自己的ErrorHandler
,我可能能够使用Gson或其他东西构建JSON对象,而不是前一篇文章的方式。
我试图让ErrorHandler
最低限度地工作:
package com.myapp.controllers;
import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
@RestController
public class ErrorMessageController implements ErrorController {
private static final String ERROR_PATH = "/error";
@Override
public String getErrorPath(){
return ERROR_PATH;
}
@RequestMapping(value = ERROR_PATH)
public String renderErrorPage(HttpServletRequest request){
String errorPage = (String) request.getAttribute("javax.servlet.error.status_code");
return errorPage;
}
}
所以我希望在网页上出现像孤独404
这样的东西。但相反,我得到一个Tomcat错误页面:
这是为什么?我很感激任何帮助。
答案 0 :(得分:2)
这是因为request.getAttribute("javax.servlet.error.status_code")
应该是Integer
,并且您将其转换为String
。这会在错误处理期间导致错误,从而弹出默认的Tomcat错误处理程序。
如果您将其投放为int
,它将起作用:
@RequestMapping(value = ERROR_PATH)
public int renderErrorPage(HttpServletRequest request){
int errorPage = (int) request.getAttribute("javax.servlet.error.status_code");
return errorPage;
}
或者,如果您只想返回某些JSON结构,则可以使用@ExceptionHandler
方法代替实现ErrorController
。
例如,假设您有以下控制器:
@GetMapping
public String getFoo() throws FileNotFoundException {
throw new FileNotFoundException("File resource for path /uploads/foobar.txt does not exist");
}
如果您想以特定方式处理所有FileNotFoundExceptions
,可以使用@ExceptionHandler
注释编写方法:
@ExceptionHandler(FileNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorResponse notFound(FileNotFoundException ex) {
return new ErrorResponse(HttpStatus.NOT_FOUND.value(), 40483, "Oops! It looks like that file does not exist.", ex.getMessage(), "http://www.mycompany.com/errors/40483");
}
在这种情况下,ErrorResponse
是包含所需字段的POJO。如果要对所有控制器重复使用它,可以将其放在@ControllerAdvice
。