【问题标题】:Spring boot returning 200 status code for custom error pagesSpring Boot为自定义错误页面返回200状态码
【发布时间】: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


【解决方案1】:

说明

在您提供的网站示例中,HttpStatus 是从注入的HttpServletResponse 中检索的。 所以如下:

适当的 HTTP 响应代码(例如 404 或 500)由 Spring 自动设置。

意思

Spring 将其设置在HttpServletResponse 上,他将其注入到他的方法中 论据。

  • 然后他必须检索状态并将其设置在他的模型ErrorJson。

解决方案

按照您的示例,您可以将方法更改为:

@RequestMapping(value = ERROR_MAPPING)
public ResponseEntity<String> error(HttpServletResponse response) {
    return new ResponseEntity<String>("This is the error page",
        HttpStatus.valueOf(response.getStatus()));
}
  • 我使用了ResponseEntity&lt;String&gt;,而不是定义自定义对象(又名ErrorJson)。

  • 我相信您知道,除了使用HttpServletResponse 的状态,您也可以使用HttpStatus 设置您的状态。

【讨论】:

  • 为什么设置为INTERNAL_SERVER_ERROR?如果响应是 503 怎么办?为什么我需要重写它?
  • 对于给定的代码,我得到一个StatusExposingServletResponse,这是响应代码默认为 200 的情况,所以如果我要删除,我总是会看到 200 错误页面。这个MyCustomErrorController 类然后我看到一个带有堆栈跟踪的 500 错误页面。
  • 不确定我是否理解。使用我的答案示例,当发生错误时,您可以使用 response.getStatus() 检索正​​确的 HttpStatus 吗?我能找到的关于 StatusExposingServletResponse 的唯一参考是:metrics.dropwizard.io/2.2.0/maven/apidocs/index.html?com/yammer/… Do you import this dependency ?这是你正在使用的吗?如果我理解,注入的 Response 是一个 StatusExposingServletResponse ,它始终是 status 200 ?如果是这样,您需要在问题中提供更多详细信息。
【解决方案2】:

在这里,您只是从一种方法返回一条消息,根据 SpringBoot,这不是错误。

以下方法将帮助您根据需要返回 http 状态码:

 @RequestMapping(value = PATH)
    public ResponseEntity<Map<String, Object>> error() {
        Map<String, Object> map = new HashMap<>();

    String statusMessage = "This is the error page";
        String statusCode = HttpStatus.BAD_REQUEST.value();

        map.put(STATUS_CODE, statusCode);
        map.put(STATUS_MESSAGE, statusMessage);

        return ResponseEntity.badRequest().body(map);
    }

【讨论】:

    猜你喜欢
    • 2011-03-16
    • 1970-01-01
    • 2017-03-30
    • 2012-07-31
    • 2015-05-12
    • 2011-05-17
    • 1970-01-01
    • 2017-08-23
    • 2014-11-30
    相关资源
    最近更新 更多