Spring引导返回自定义错误页面的200状态代码

时间:2016-09-28 01:01:17

标签: java spring spring-boot

我想覆盖whitelabel错误页面。举个例子,我做了这个简单的类:

@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.

然而,这不是我所看到的。例如,如果我点击一个URL,我知道它应该回复我500状态代码(故意NullPointerException),那么这就是我应该看到的,但当我点击该URL时,我得到200回复我的错误信息(“这是错误页面”)

如果我不使用这个自定义控制器,那么它会向我显示一个带有堆栈跟踪的500错误页面,这是默认行为。我在2014年看到了一个旧问题: https://github.com/spring-projects/spring-boot/issues/684有人提到同样的问题,但是他们的解决方案是明确显示500个响应,这些响应并没有真正通过HTTP响应代码。

为了记录,我实际上给org.apache.catalina.connector.Response.sendError()方法设置了一个断点。当这个自定义错误控制器不存在时,我可以清楚地看到正在调用状态为500的sendError()方法。但是,如果我要将HttpServletResponse参数添加到我的error()方法中,我看不到实例有500个状态代码集。

2 个答案:

答案 0 :(得分:1)

解释

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

  

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

装置

  

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<String>而不是定义自定义对象(a.k.a。ErrorJson)。

  • 我相信您知道,或者使用HttpServletResponse的状态,您可以使用HttpStatus设置自己的状态。

答案 1 :(得分:0)

这里只是从一个方法返回一条消息,这不是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);
    }