import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.rmi.ServerException;
import java.util.List;
@RestControllerAdvice
@Slf4j
public class GlobalException {
/**
* 校验异常
*/
@ExceptionHandler(value = {MethodArgumentNotValidException.class})
public R MethodArgumentNotValidException(MethodArgumentNotValidException e) {
BindingResult exceptions = e.getBindingResult();
// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
if (exceptions.hasErrors()) {
List errors = exceptions.getAllErrors();
if (!errors.isEmpty()) {
// 这里列出了全部错误参数,按正常逻辑,只需要第一条错误即可
FieldError fieldError = (FieldError) errors.get(0);
return R.fail(fieldError.getDefaultMessage());
}
}
return R.fail("请求参数错误");
}
@ExceptionHandler(value = { BindException.class})
public R BindException(BindException e) {
BindingResult exceptions = e.getBindingResult();
// 判断异常中是否有错误信息,如果存在就使用异常中的消息,否则使用默认消息
if (exceptions.hasErrors()) {
List errors = exceptions.getAllErrors();
if (!errors.isEmpty()) {
// 这里列出了全部错误参数,按正常逻辑,只需要第一条错误即可
FieldError fieldError = (FieldError) errors.get(0);
return R.fail(fieldError.getDefaultMessage());
}
}
return R.fail("请求参数错误");
}
@ExceptionHandler(value = HttpMessageNotReadableException.class)
public R HttpMessageNotReadableException(HttpMessageNotReadableException e) {
return R.fail("请求参数错误");
}
/**
* 未知异常
*/
@ExceptionHandler(value = Exception.class)
public R unKnowExceptionHandler(Exception e) {
StackTraceElement[] elements = e.getStackTrace();
String message = StringUtils.EMPTY;
if(elements.length > 0){
StackTraceElement element = elements[0];
message = StringUtils.join("控制器", element.getClassName(), ".", element.getMethodName(), "类的第", element.getLineNumber(), "行发生", e.toString(), "异常");
}
if(StringUtils.isBlank(message)){
message = e.getMessage();
}
log.error(String.format("操作异常!message:%s,错误信息:",message), e);
return R.fail(e.getMessage(),"操作异常");
}
/**
* 业务异常
* @param e
* @return
*/
@ExceptionHandler(value = ServerException.class)
public R ServerException(ServerException e) {
StackTraceElement[] elements = e.getStackTrace();
String message = StringUtils.EMPTY;
if(elements.length > 0){
StackTraceElement element = elements[0];
message = StringUtils.join("控制器", element.getClassName(), ".", element.getMethodName(), "类的第", element.getLineNumber(), "行发生", e.toString(), "异常");
}
if(StringUtils.isBlank(message)){
message = e.getMessage();
}
log.error(String.format("业务异常!message:%s,错误信息:",message), e);
return R.fail("业务异常");
}
/**
* 运行时异常
* @param e
* @return
*/
@ExceptionHandler(value = RuntimeException.class)
public R RuntimeException(RuntimeException e) {
StackTraceElement[] elements = e.getStackTrace();
String message = StringUtils.EMPTY;
if(elements.length > 0){
StackTraceElement element = elements[0];
message = StringUtils.join("控制器", element.getClassName(), ".", element.getMethodName(), "类的第", element.getLineNumber(), "行发生", e.toString(), "异常");
}
if(StringUtils.isBlank(message)){
message = e.getMessage();
}
log.error(String.format("操作失败:!message:%s,错误信息:",message), e);
return R.fail(e.getMessage());
}
}
java 异常统一处理
最新推荐文章于 2024-04-13 20:11:35 发布
这篇文章描述了一个SpringBoot应用中的全局异常处理类GlobalException,它处理了多种类型的异常,如验证错误、HTTP消息解析错误、未知异常和业务/运行时异常,提供统一的错误响应并记录详细日志。
摘要由CSDN通过智能技术生成