GlobalExceptionHandler.java
6.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
package com.aigeo.common.exception;
import com.aigeo.common.result.Result;
import com.aigeo.common.result.ResultCode;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.NoHandlerFoundException;
import java.util.stream.Collectors;
/**
* 全局异常处理器
*
* @author AIGEO Team
* @since 1.0.0
*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 业务异常处理
*/
@ExceptionHandler(BusinessException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Result<Void> handleBusinessException(BusinessException ex, HttpServletRequest request) {
log.warn("业务异常 [{}]: {}", request.getRequestURI(), ex.getMessage());
return Result.error(ex.getCode(), ex.getMessage());
}
/**
* 参数校验异常处理
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Result<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex, HttpServletRequest request) {
String message = ex.getBindingResult().getFieldErrors().stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.joining(", "));
log.warn("参数校验异常 [{}]: {}", request.getRequestURI(), message);
return Result.badRequest(message);
}
/**
* 绑定异常处理
*/
@ExceptionHandler(BindException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Result<Void> handleBindException(BindException ex, HttpServletRequest request) {
String message = ex.getBindingResult().getFieldErrors().stream()
.map(FieldError::getDefaultMessage)
.collect(Collectors.joining(", "));
log.warn("绑定异常 [{}]: {}", request.getRequestURI(), message);
return Result.badRequest(message);
}
/**
* 约束违反异常处理
*/
@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Result<Void> handleConstraintViolationException(ConstraintViolationException ex, HttpServletRequest request) {
String message = ex.getConstraintViolations().stream()
.map(ConstraintViolation::getMessage)
.collect(Collectors.joining(", "));
log.warn("约束违反异常 [{}]: {}", request.getRequestURI(), message);
return Result.badRequest(message);
}
/**
* 方法参数类型不匹配异常处理
*/
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public Result<Void> handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException ex, HttpServletRequest request) {
String message = String.format("参数 '%s' 类型不匹配,需要类型: %s",
ex.getName(), ex.getRequiredType().getSimpleName());
log.warn("参数类型不匹配 [{}]: {}", request.getRequestURI(), message);
return Result.badRequest(message);
}
/**
* 认证异常处理
*/
@ExceptionHandler(AuthenticationException.class)
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public Result<Void> handleAuthenticationException(AuthenticationException ex, HttpServletRequest request) {
log.warn("认证异常 [{}]: {}", request.getRequestURI(), ex.getMessage());
return Result.unauthorized("认证失败,请重新登录");
}
/**
* 凭证错误异常处理
*/
@ExceptionHandler(BadCredentialsException.class)
@ResponseStatus(HttpStatus.UNAUTHORIZED)
public Result<Void> handleBadCredentialsException(BadCredentialsException ex, HttpServletRequest request) {
log.warn("凭证错误 [{}]: {}", request.getRequestURI(), ex.getMessage());
return Result.unauthorized("用户名或密码错误");
}
/**
* 访问拒绝异常处理
*/
@ExceptionHandler(AccessDeniedException.class)
@ResponseStatus(HttpStatus.FORBIDDEN)
public Result<Void> handleAccessDeniedException(AccessDeniedException ex, HttpServletRequest request) {
log.warn("访问拒绝 [{}]: {}", request.getRequestURI(), ex.getMessage());
return Result.forbidden("权限不足,访问被拒绝");
}
/**
* 请求方法不支持异常处理
*/
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
@ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
public Result<Void> handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException ex, HttpServletRequest request) {
log.warn("请求方法不支持 [{}]: {}", request.getRequestURI(), ex.getMessage());
return Result.error(ResultCode.METHOD_NOT_ALLOWED);
}
/**
* 找不到处理器异常处理
*/
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public Result<Void> handleNoHandlerFoundException(NoHandlerFoundException ex, HttpServletRequest request) {
log.warn("找不到处理器 [{}]: {}", request.getRequestURI(), ex.getMessage());
return Result.notFound("请求的资源不存在");
}
/**
* 运行时异常处理
*/
@ExceptionHandler(RuntimeException.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Result<Void> handleRuntimeException(RuntimeException ex, HttpServletRequest request) {
log.error("运行时异常 [{}]: ", request.getRequestURI(), ex);
return Result.error("系统运行异常,请联系管理员");
}
/**
* 通用异常处理
*/
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public Result<Void> handleException(Exception ex, HttpServletRequest request) {
log.error("系统异常 [{}]: ", request.getRequestURI(), ex);
return Result.error("系统内部错误,请联系管理员");
}
}