404错误
404错误是不经过Controller的,所以使用@ControllerAdvice或@RestControllerAdvice无法获取到404错误
springboot2处理404错误的两种方式
第一种:直接配置
#出现错误时, 直接抛出异常
spring.mvc.throw-exception-if-no-handler-found=true
比如和swagger集成时,访问/swagger-ui.html会出现404异常
第二种:继承ErrorController来处理错误
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
public class MyErrorController implements ErrorController {
@RequestMapping("/error")
public String handleError(HttpServletRequest request){
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if(statusCode == 500){
return "/error/500";
}else if(statusCode == 404){
return "/error/404";
}
}
@Override
public String getErrorPath() {
return "/error";
}
}
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public Object defaultErrorHandler(HttpServletRequest req, HandlerMethod handlerMethod, Throwable ex){
if(WebUtils.isAjax(handlerMethod)){
return new ErrorInfo(ErrorInfo.FAILURE_STATUS,"Server exception, please try again later");
}else {
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("/error/500");
return modelAndView;
}
}
/**
* @see 后续通过自定义异常使用
* @param req
* @param e
* @return
*/
@ResponseBody
@ExceptionHandler(value = WmsException.class)
public ResultVO jsonErrorHandler(HttpServletRequest req, WmsException e) {
ResultVO resultVO = ResultVO.failure(e.getMessage());
return resultVO;
}
}
public class WebUtils extends org.springframework.web.util.WebUtils {
/**
* 判断是否ajax请求
* spring ajax 返回含有 ResponseBody 或者 RestController注解
* @param handlerMethod HandlerMethod
* @return 是否ajax请求
*/
public static boolean isAjax(HandlerMethod handlerMethod) {
ResponseBody responseBody = handlerMethod.getMethodAnnotation(ResponseBody.class);
if (null != responseBody) {
return true;
}
// 获取类上面的Annotation,可能包含组合注解,故采用spring的工具类
Class<?> beanType = handlerMethod.getBeanType();
responseBody = AnnotationUtils.getAnnotation(beanType, ResponseBody.class);
if (null != responseBody) {
return true;
}
return false;
}
}