| | |
| | | package com.yuanchu.limslaboratory.handler; |
| | | |
| | | import com.yuanchu.limslaboratory.exception.AuthException; |
| | | import com.yuanchu.limslaboratory.exception.MyFileException; |
| | | import com.yuanchu.limslaboratory.utils.MyUtil; |
| | | import com.yuanchu.limslaboratory.utils.ServletUtils; |
| | | import com.yuanchu.limslaboratory.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.Value; |
| | | import org.springframework.dao.DataAccessException; |
| | | import org.springframework.dao.DataIntegrityViolationException; |
| | | import org.springframework.dao.DuplicateKeyException; |
| | | import org.springframework.http.HttpStatus; |
| | | import org.springframework.http.ResponseEntity; |
| | | 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 java.io.FileNotFoundException; |
| | | import java.io.IOException; |
| | | import java.net.BindException; |
| | | import java.sql.SQLException; |
| | | import java.sql.SQLIntegrityConstraintViolationException; |
| | | import java.util.List; |
| | | import java.util.stream.Collectors; |
| | | |
| | | |
| | | @Slf4j |
| | | @RestControllerAdvice |
| | | public class GlobalExceptionHandler { |
| | | |
| | | @Value("${spring.servlet.multipart.max-file-size}") |
| | | private String maxFileSize; |
| | | |
| | | @Value("${spring.servlet.multipart.max-request-size}") |
| | | private String maxRequestSize; |
| | | |
| | | @ExceptionHandler(SQLException.class) |
| | | public Result<?> handlerSQLException(SQLException e) |
| | | { |
| | |
| | | log.error(String.valueOf(e)); |
| | | String message = e.getCause().getMessage(); |
| | | String[] split = message.split("'"); |
| | | String servletPath = ServletUtils.getRequest().getServletPath(); |
| | | System.out.println(servletPath); |
| | | if("/user/add_new_personnel".equals(servletPath)){ |
| | | return Result.fail("账号重复,添加失败,请核对后操作。"); |
| | | } |
| | | return Result.fail("重复添加:【" + split[1] + "】操作失败!"); |
| | | } |
| | | |
| | |
| | | /** 运行时异常 */ |
| | | @ExceptionHandler(RuntimeException.class) |
| | | public Result<?> runtimeExceptionHandler(RuntimeException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("运行时异常"); |
| | | } |
| | | |
| | | /** 类型转换异常 */ |
| | | @ExceptionHandler(ClassCastException.class) |
| | | public Result<?> classCastExceptionHandler(ClassCastException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("类型转换异常"); |
| | | } |
| | | /** 文件未找到异常 */ |
| | | @ExceptionHandler(FileNotFoundException.class) |
| | | public Result<?> FileNotFoundException(FileNotFoundException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("文件未找到异常"); |
| | | } |
| | | /** 数字格式异常 */ |
| | | @ExceptionHandler(NumberFormatException.class) |
| | | public Result<?> NumberFormatException(NumberFormatException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("数字格式异常"); |
| | | } |
| | | /** 安全异常 */ |
| | | @ExceptionHandler(SecurityException.class) |
| | | public Result<?> SecurityException(SecurityException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("安全异常"); |
| | | } |
| | | |
| | | /** 类型不存在异常 */ |
| | | @ExceptionHandler(TypeNotPresentException.class) |
| | | public Result<?> TypeNotPresentException(TypeNotPresentException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("类型不存在异常"); |
| | | } |
| | | |
| | | /** IO异常 */ |
| | | @ExceptionHandler(IOException.class) |
| | | public Result<?> iOExceptionHandler(IOException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("IO异常"); |
| | | } |
| | | |
| | | /** 未知方法异常 */ |
| | | @ExceptionHandler(NoSuchMethodException.class) |
| | | public Result<?> noSuchMethodExceptionHandler(NoSuchMethodException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("未知方法异常"); |
| | | } |
| | | |
| | | /** 数组越界异常 */ |
| | | @ExceptionHandler(IndexOutOfBoundsException.class) |
| | | public Result<?> indexOutOfBoundsExceptionHandler(IndexOutOfBoundsException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("数组越界异常"); |
| | | } |
| | | /** sql语法错误异常 */ |
| | | @ExceptionHandler(BadSqlGrammarException.class) |
| | | public Result<?> BadSqlGrammarException(BadSqlGrammarException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("sql语法错误异常"); |
| | | } |
| | | |
| | | /** 无法注入bean异常 */ |
| | | @ExceptionHandler(NoSuchBeanDefinitionException.class) |
| | | public Result<?> NoSuchBeanDefinitionException(NoSuchBeanDefinitionException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("无法注入bean"); |
| | | } |
| | | |
| | | /** Http消息不可读异常 */ |
| | | @ExceptionHandler({HttpMessageNotReadableException.class}) |
| | | public Result<?> requestNotReadable(HttpMessageNotReadableException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("Http消息不可读"); |
| | | } |
| | | |
| | | /** 400错误 */ |
| | | @ExceptionHandler({TypeMismatchException.class}) |
| | | public Result<?> requestTypeMismatch(TypeMismatchException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("服务器异常"); |
| | | } |
| | | |
| | | /** 500错误 */ |
| | | @ExceptionHandler({ConversionNotSupportedException.class, HttpMessageNotWritableException.class}) |
| | | public Result<?> server500(RuntimeException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("服务器异常"); |
| | | } |
| | | |
| | | /** 栈溢出 */ |
| | | @ExceptionHandler({StackOverflowError.class}) |
| | | public Result<?> requestStackOverflow(StackOverflowError e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("栈溢出异常"); |
| | | } |
| | | |
| | | /** 除数不能为0 */ |
| | | @ExceptionHandler({ArithmeticException.class}) |
| | | public Result<?> arithmeticException(ArithmeticException e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("除数不能为0异常"); |
| | | } |
| | | |
| | | /** |
| | | *文件过大报错提示 |
| | | */ |
| | | @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({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); |
| | | } |
| | | |
| | | /** 其他错误 */ |
| | | @ExceptionHandler({Exception.class}) |
| | | public Result<?> exception(Exception e) { |
| | | log.error(e.getMessage(), e.getCause()); |
| | | e.printStackTrace(); |
| | | return Result.fail("网络连接失败,请退出后再试"); |
| | | } |
| | | |
| | | @ExceptionHandler({AuthException.class}) |
| | | public Result<?> noAuth(AuthException e){ |
| | | return Result.fail(Integer.valueOf(e.getCode()),e.getMsg()); |
| | | } |
| | | |
| | | |
| | | } |