SpringBoot 异常区分页面请求或Json请求

@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界面

 

[plain]  view plain  copy
 
  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格式的响应

 

[plain]  view plain  copy
 
  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这个类上

 

[java]  view plain  copy
 
  1. @RequestMapping(  
  2.         value = {"${error.path:/error}"},  
  3.         produces = {"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.         Map body = this.getErrorAttributes(request, this.getTraceParameter(request));  
  13.         HttpStatus status = this.getStatus(request);  
  14.         return new ResponseEntity(body, status);  
  15.     }  

 

spring boot 根据Accept头的内容,输出不同格式的错误响应。比如针对浏览器的请求生成html页面,针对其它请求生成json格式的返回。字段为accept的text/html的内容来判断

猜你喜欢

转载自xinjiatao.iteye.com/blog/2404600