【发布时间】:2016-09-28 01:01:16
【问题描述】:
我想覆盖白标错误页面。所以作为一个例子,我做了这个简单的类:
@RestController
public class MyCustomErrorController implements ErrorController {
private static final String PATH = "/error";
@RequestMapping(value = PATH)
public String error() {
return "This is the error page";
}
@Override
public String getErrorPath() {
return PATH;
}
}
我从这里举了我的例子: https://gist.github.com/jonikarppinen/662c38fb57a23de61c8b
根据那个要点,它实际上有这样的评论:
// Appropriate HTTP response code (e.g. 404 or 500) is automatically set by Spring.
// Here we just define response body.
但是,这不是我所看到的。例如,如果我点击一个我知道它应该向我响应 500 状态代码(故意NullPointerException)的 URL,那么这就是我应该看到的,但是当我点击该 URL 时,我会收到 200 响应并返回我的错误message ("这是错误页面")
如果我不使用这个自定义控制器,它会显示一个 500 错误页面,上面有堆栈跟踪,这是默认行为。我在这里看到了一个 2014 年打开的旧问题: https://github.com/spring-projects/spring-boot/issues/684 有人提到了同样的问题,但是他们的解决方案是明确显示 500 个响应,这并没有真正通过 HTTP 响应代码。
为了记录,我实际上在org.apache.catalina.connector.Response.sendError() 方法上设置了一个断点。当此自定义错误控制器不存在时,我可以清楚地看到 sendError() 方法正在以状态 500 调用。但是,如果我将 HttpServletResponse 参数添加到我的 error() 方法中,我看不到该实例的状态为 500代码集。
【问题讨论】:
-
查看this doc 的 Spring 控制器异常处理。
标签: java spring spring-boot