我想覆盖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个状态代码集。
答案 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);
}