@RestController
public class RestErrorEndpoint implements ErrorController {
@Override
public String getErrorPath() {
return null;
}
@RequestMapping(value = {"${server.error.path:${error.path:/error}}"},produces="application/json")
@ResponseBody
public String error(HttpServletRequest request) {
System.out.println("json");
return "helloError";
}
@RequestMapping( value = {"${server.error.path:${error.path:/error}}"}, produces = {"text/html"} )
public ModelAndView errorHtml(HttpServletRequest request) {
System.out.println("html");
return new ModelAndView("/error/error");
}
// @RequestMapping({"${error.path:/error}"})
// @ResponseBody
// public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
// Map body = this.getErrorAttributes(request, this.getTraceParameter(request));
// HttpStatus status = this.getStatus(request);
// return new ResponseEntity(body, status);
// }
}
spring boot 根据Accept头的内容,输出不同格式的错误响应。比如针对浏览器的请求生成html页面,针对其它请求生成json格式的返回。字段为accept的text/html的内容来判断。
produces = {"text/html"} 页面请求。
produces="application/json"为json或ajax请求
============================================================
最近开始使用springboot,发现一个奇怪的现象,一个url报错
使用浏览器地址请求返回一个html界面
1. Whitelabel Error Page
2.
3. This application has no explicit mapping for /error, so you are seeing this as a fallback.
4.
5. Tue Nov 29 10:48:26 CST 2016
6. There was an unexpected error (type=Bad Request, status=400).
7. Required String parameter 'fileName' is not present
使用postman请求返回一个json格式的响应
1. {
2. "timestamp": 1480388264722,
3. "status": 400,
4. "error": "Bad Request",
5. "exception": "org.springframework.web.bind.MissingServletRequestParameterException",
6. "message": "Required String parameter 'fileName' is not present",
7. "path": "/file/delete"
8. }
究竟spring boot怎么来区分这种请求返回不同格式的数据的呢。经过一步步跟进。精髓在BasicErrorController这个类上
1. @RequestMapping(
2. "${error.path:/error}"},
3. "text/html"}
4. )
5. public ModelAndView errorHtml(HttpServletRequest request) {
6. return new ModelAndView("error", this.getErrorAttributes(request, false));
7. }
8.
9. @RequestMapping({"${error.path:/error}"})
10. @ResponseBody
11. public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
12. this.getErrorAttributes(request, this.getTraceParameter(request));
13. this.getStatus(request);
14. return new ResponseEntity(body, status);
15. }
spring boot 根据Accept头的内容,输出不同格式的错误响应。比如针对浏览器的请求生成html页面,针对其它请求生成json格式的返回。字段为accept的text/html的内容来判断