SpringBoot异常默认处理机制
springboot项目中对于异常有自己的处理方式;区分浏览器(返回错误页面)与其他处理方式(返回Json格式数据)
例如访问一个不存在的页面
localhost:8080/xxx 该Url不存在
默认:
加入在resources目录下创建/resources/error目录,目录中创建对应错误码页面,则错误请求会返回对应的页面
自定义异常:
// 1)创建异常自定义类 继承RunTimeException
public class UserNotExistException extends RuntimeException {
private static final long serialVersionUID = -6112780192479692859L;
private String id;
public UserNotExistException(){
super("user not exist!!");
}
}
// 2)在接口中抛出了该异常
throw new UserNotExistException();
3)使用restlet client 测试接口;message信息为自定义的信息,状态:500
自定义异常处理器
当请求的接口抛出了异常时会进入ControllerExceptionHandler异常处理器
当抛出的异常是UserNotExistException时会进入handlerUserNotExistException方法,最终返回一个json
// 异常处理器
@ControllerAdvice // 处理其他controller抛出来的异常
public class ControllerExceptionHandler {
@ExceptionHandler(UserNotExistException.class) // 此方法处理UserNotExistException异常
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 服务器内部错误
public Map<String,Object> handlerUserNotExistException(UserNotExistException ex){
Map<String,Object> result = new HashMap<>();
result.put("id",ex.getId());
return result;
}
}
再次请求:http://localhost:8060/user/1
返回 :{"id": "1"}
假如有一个需求:现有一个方法是GET请求,但是你使用POST访问;提示 POST请求不被支持
代码实现如下:
import com.imooc.exception.UserNotExistException;
import org.springframework.http.HttpStatus;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import java.util.HashMap;
import java.util.Map;
// 异常处理器
@ControllerAdvice // 处理其他controller抛出来的异常
public class ControllerExceptionHandler{
// HttpRequestMethodNotSupportedException 处理
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
@ResponseBody
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
public Map<String,Object> handlerUserNotSupportedException(HttpRequestMethodNotSupportedException ex){
String message = ex.getMessage();
String method = ex.getMethod();
Class<? extends HttpRequestMethodNotSupportedException> aClass = ex.getClass();
Map<String,Object> result = new HashMap<>();
result.put("message",method +"请求不被支持");
result.put("status",405);
return result;
}
}