服务异常处理

spring boot对404处理结果

  • 浏览器请求结果


  • Postman请求结果


先看一下源码BasicErrorController

@RequestMapping(
        produces = {"text/html"}
    )
    public ModelAndView errorHtml(HttpServletRequest request, HttpServletResponse response) {
        HttpStatus status = this.getStatus(request);
        Map model = Collections.unmodifiableMap(this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.TEXT_HTML)));
        response.setStatus(status.value());
        ModelAndView modelAndView = this.resolveErrorView(request, response, status, model);
        return modelAndView == null ? new ModelAndView("error", model) : modelAndView;
    }

    @RequestMapping
    @ResponseBody
    public ResponseEntity> error(HttpServletRequest request) {
        Map body = this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.ALL));
        HttpStatus status = this.getStatus(request);
        return new ResponseEntity(body, status);
    }
  • 这两个方法分别对应着刚才的两种请求,我们可以知道造成这种不同的原因是http请求的header中的Accept是不是有text/html

所以对于异常的处理,我们也应该分成两个方面来进行处理

1.对于Accept拥有text/html的处理

在resources/resources/error目录下新建响应的错误页面


  • 修改完后的效果


2.对其他形式访问的处理

/**
 * @Auther: guaidan
 * @Date: 2018/10/9 14:41
 * @Description:
 */
@ControllerAdvice
public class ControllerExceptionHandler {

     @ExceptionHandler(UserNotFoundException.class)
     @ResponseBody
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
     public Map handleUserNotFindException(UserNotFoundException ex){
         Map result = new HashMap<>();
         result.put("id",ex.getId());
         result.put("msg",ex.getMessage());
         return result;
     }

}

响应结果


你可能感兴趣的:(服务异常处理)