package com.yuanchu.tms.handler;
|
|
import com.yuanchu.tms.exception.MyFileException;
|
import com.yuanchu.tms.vo.Result;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException;
|
import org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException;
|
import org.springframework.beans.ConversionNotSupportedException;
|
import org.springframework.beans.TypeMismatchException;
|
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.dao.DuplicateKeyException;
|
import org.springframework.http.converter.HttpMessageNotReadableException;
|
import org.springframework.http.converter.HttpMessageNotWritableException;
|
import org.springframework.jdbc.BadSqlGrammarException;
|
import org.springframework.validation.ObjectError;
|
import org.springframework.web.bind.MethodArgumentNotValidException;
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
import org.springframework.web.multipart.MultipartException;
|
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.FileNotFoundException;
|
import java.io.IOException;
|
import java.sql.SQLException;
|
import java.util.List;
|
import java.util.stream.Collectors;
|
|
|
@Slf4j
|
@RestControllerAdvice
|
public class GlobalExceptionHandler {
|
|
@Autowired
|
HttpServletResponse response;
|
|
@ExceptionHandler(SQLException.class)
|
public Result<?> handlerSQLException(SQLException e) {
|
log.error(e.getMessage().toLowerCase(), e);
|
response.setStatus(500);
|
return Result.fail("数据操作失败!请联系管理员");
|
}
|
|
/**
|
* 唯一值在数据库中重复
|
* Duplicate entry ' ' for key ' '
|
*
|
* @param e:重复键异常
|
* @return 199
|
*/
|
@ExceptionHandler
|
public Result<?> DuplicateKeyException(DuplicateKeyException e) {
|
log.error(String.valueOf(e));
|
String message = e.getCause().getMessage();
|
String[] split = message.split("'");
|
response.setStatus(500);
|
return Result.fail("重复添加:【" + split[1] + "】操作失败!");
|
}
|
|
@ExceptionHandler
|
public Result<?> NullPointerException(NullPointerException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("部分参数为空,请检查!");
|
}
|
|
/**
|
* 运行时异常
|
*/
|
@ExceptionHandler(RuntimeException.class)
|
public Result<?> runtimeExceptionHandler(RuntimeException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("运行时异常");
|
}
|
|
/**
|
* 类型转换异常
|
*/
|
@ExceptionHandler(ClassCastException.class)
|
public Result<?> classCastExceptionHandler(ClassCastException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("类型转换异常");
|
}
|
|
/**
|
* 文件未找到异常
|
*/
|
@ExceptionHandler(FileNotFoundException.class)
|
public Result<?> FileNotFoundException(FileNotFoundException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("文件未找到异常");
|
}
|
|
/**
|
* 数字格式异常
|
*/
|
@ExceptionHandler(NumberFormatException.class)
|
public Result<?> NumberFormatException(NumberFormatException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("数字格式异常");
|
}
|
|
/**
|
* 安全异常
|
*/
|
@ExceptionHandler(SecurityException.class)
|
public Result<?> SecurityException(SecurityException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("安全异常");
|
}
|
|
/**
|
* 类型不存在异常
|
*/
|
@ExceptionHandler(TypeNotPresentException.class)
|
public Result<?> TypeNotPresentException(TypeNotPresentException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("类型不存在异常");
|
}
|
|
/**
|
* IO异常
|
*/
|
@ExceptionHandler(IOException.class)
|
public Result<?> iOExceptionHandler(IOException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("IO异常");
|
}
|
|
/**
|
* 未知方法异常
|
*/
|
@ExceptionHandler(NoSuchMethodException.class)
|
public Result<?> noSuchMethodExceptionHandler(NoSuchMethodException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("未知方法异常");
|
}
|
|
/**
|
* 数组越界异常
|
*/
|
@ExceptionHandler(IndexOutOfBoundsException.class)
|
public Result<?> indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("数组越界异常");
|
}
|
|
/**
|
* sql语法错误异常
|
*/
|
@ExceptionHandler(BadSqlGrammarException.class)
|
public Result<?> BadSqlGrammarException(BadSqlGrammarException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("sql语法错误异常");
|
}
|
|
/**
|
* 无法注入bean异常
|
*/
|
@ExceptionHandler(NoSuchBeanDefinitionException.class)
|
public Result<?> NoSuchBeanDefinitionException(NoSuchBeanDefinitionException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("无法注入bean");
|
}
|
|
/**
|
* Http消息不可读异常
|
*/
|
@ExceptionHandler({HttpMessageNotReadableException.class})
|
public Result<?> requestNotReadable(HttpMessageNotReadableException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("Http消息不可读");
|
}
|
|
/**
|
* 400错误
|
*/
|
@ExceptionHandler({TypeMismatchException.class})
|
public Result<?> requestTypeMismatch(TypeMismatchException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("服务器异常");
|
}
|
|
/**
|
* 500错误
|
*/
|
@ExceptionHandler({ConversionNotSupportedException.class, HttpMessageNotWritableException.class})
|
public Result<?> server500(RuntimeException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("服务器异常");
|
}
|
|
/**
|
* 栈溢出
|
*/
|
@ExceptionHandler({StackOverflowError.class})
|
public Result<?> requestStackOverflow(StackOverflowError e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("栈溢出异常");
|
}
|
|
/**
|
* 除数不能为0
|
*/
|
@ExceptionHandler({ArithmeticException.class})
|
public Result<?> arithmeticException(ArithmeticException e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("除数不能为0异常");
|
}
|
|
/**
|
* 参数检验
|
*/
|
@ExceptionHandler({MethodArgumentNotValidException.class})
|
public Result<?> methodArgumentNotValidException(MethodArgumentNotValidException e) {
|
List<ObjectError> allErrors = e.getBindingResult().getAllErrors();
|
String message = allErrors.stream().map(s -> s.getDefaultMessage()).collect(Collectors.joining(";"));
|
return Result.fail(message);
|
}
|
|
@Value("${spring.servlet.multipart.max-file-size}")
|
private String maxFileSize;
|
|
@Value("${spring.servlet.multipart.max-request-size}")
|
private String maxRequestSize;
|
|
/**
|
*文件过大报错提示
|
*/
|
@ExceptionHandler({MultipartException.class})
|
public Result<?> fileUploadExceptionHandler(MultipartException e) {
|
String msg;
|
Throwable rootCause = e.getRootCause();
|
if (rootCause instanceof FileSizeLimitExceededException) {
|
msg="上传文件过大【单个文件大小不得超过" + maxFileSize + "】";
|
}else if(rootCause instanceof SizeLimitExceededException){
|
msg="上传文件过大【总上传大小不得超过" + maxRequestSize + "】";
|
}else {
|
msg="文件上传失败【服务器异常】";
|
}
|
return Result.fail(msg);
|
}
|
|
/** 文件后缀名不通过返回提示 */
|
@ExceptionHandler({MyFileException.class})
|
public Result<?> myFileException(Exception e) {
|
return Result.fail("抱歉不支持【" + e.getMessage() +"】后缀的文件!");
|
}
|
|
/** 其他错误 */
|
/**
|
* 其他错误
|
*/
|
@ExceptionHandler({Exception.class})
|
public Result<?> exception(Exception e) {
|
e.printStackTrace();
|
response.setStatus(500);
|
return Result.fail("网络连接失败,请退出后再试");
|
}
|
}
|