提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
全局异常处理
在controller层调用service层的方法时,如果service的方法有异常抛出,在controller层就要不断地try-catch来处理异常,代码十分冗余。所以用全局异常处理来捕捉异常,对异常进行统一分类处理。
1.ExceptionController.java
全局捕获异常,并且按异常分类返回信息
代码如下:
import com.xxx.xxx.configuration.exception.BusinessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
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 com.lmy.springbootdemo.utils.Result;
/**
* 全局异常处理,一旦发生该类异常,就会捕捉处理,返回给前端信息
*/
@ControllerAdvice
public class ExceptionController {
private final Logger logger = LoggerFactory.getLogger(ExceptionController.class);
/**
* 处理validator捕获的入参异常
* @param exception
* @return
*/
//@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Result handleValidException(MethodArgumentNotValidException exception){
Result result = new Result();
//result.setCode("400");
String message = exception.getBindingResult().getFieldError().getDefaultMessage();
// exception.getBindingResult().getFieldErrors(); 获取所有的错误信息
logger.info(message);
result.setFlag(false);
result.setMessage(message);
return result;
}
/**
* 处理业务异常
* @param e
* @return
*/
@ExceptionHandler(BusinessException.class)
@ResponseBody
public Result handleBusinessException(BusinessException e){
logger.info(e.getMessage(), e);
Result result = new Result();
result.setMessage(e.getMessage());
result.setFlag(false);
return result;
}
/**
* 处理其他未分类异常
*/
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ExceptionHandler(Exception.class)
@ResponseBody
public Result handleException(Exception e){
logger.error(e.getMessage(), e);
Result result = new Result();
result.setMessage(e.getMessage());
result.setFlag(false);
return result;
}
}
2.业务异常处理
可以将业务异常统一进行封装,写一个工具类,然后在service层抛出
BusinessException.java::
public class BusinessException extends RuntimeException{
public BusinessException(String message){
super(message);
}
}
工具类:
/**
* 业务异常工具类
*/
public class EXCUtil {
public static void isTrue(boolean flag, String error) {
if (!flag) {
throw new BusinessException(error);
}
}
}
在service层抛出业务异常:(举例)
@Override
public int addBook(AddBookRequest request) {
//查询图书是否存在
Integer bookNum = bookService.countByBookCard(request.getCard());
if (bookNum != 0) {
logger.info("该图书已经录入,bookAdd param:{}", JSON.toJSONString(request));
EXCUtil.isTrue(false, MessageEnum.BOOK_ALREADY_EXIST);
}
//添加图书
if(request.getNumfree() + request.getNumborrow() != request.getNumtotal()){
EXCUtil.isTrue(false, "图书数量有误,请仔细检查");
}
BookPO bookPO = new BookPO();
EXCUtil.copyProperties(request, bookPO);
int insert = bookPOMapper.insertPrimaryKey(bookPO);
logger.info("addBook param:{}, result num:{}", JSON.toJSONString(request), insert);
return insert;
}
Resultl结果返回类:
/**
* 封装返回结果
*/
public class Result<T> implements Serializable{
private boolean flag;//执行结果,true为执行成功 false为执行失败
private String message;//返回结果信息
private Object data;//返回数据
public Result(boolean flag, String message) {
super();
this.flag = flag;
this.message = message;
}
public Result(boolean flag, String message, Object data) {
this.flag = flag;
this.message = message;
this.data = data;
}
public Result() {
}
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static Result isSuccess(String message, Object data){
return new Result(true, message, data);
}
public static Result isSuccess( String message){
return new Result(true, message);
}
public static Result isFail(String message, Object data){
return new Result(false, message, data);
}
public static Result isFail( String message){
return new Result(false, message);
}
}