first commit.

This commit is contained in:
2022-12-07 18:14:38 +08:00
commit e916d067f3
183 changed files with 9649 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
package xyz.zhouxy.plusone.exception.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import xyz.zhouxy.plusone.exception.handler.BaseExceptionHandler.ExceptionInfoHolder;
@Configuration
public class PlusoneExceptionHandlerConfig {
@Bean
@ConditionalOnMissingBean
ExceptionInfoHolder exceptionInfoHolder() {
return new ExceptionInfoHolder();
}
}

View File

@@ -0,0 +1,29 @@
package xyz.zhouxy.plusone.exception.handler;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import lombok.extern.slf4j.Slf4j;
import xyz.zhouxy.plusone.util.RestfulResult;
/**
* 处理所有异常的处理器
*
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
*/
@ConditionalOnProperty(prefix = "plusone.exception", name = "handle-all-exception", havingValue = "true")
@RestControllerAdvice
@Slf4j
public class AllExceptionHandler extends BaseExceptionHandler {
protected AllExceptionHandler(ExceptionInfoHolder exceptionInfoHolder) {
super(exceptionInfoHolder);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<RestfulResult> handleException(Throwable e) {
log.error(e.getMessage(), e);
return this.buildExceptionResponse(e);
}
}

View File

@@ -0,0 +1,63 @@
package xyz.zhouxy.plusone.exception.handler;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.dao.DataAccessException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import lombok.extern.slf4j.Slf4j;
import xyz.zhouxy.plusone.util.RestfulResult;
/**
* 默认异常的处理器
*
* <p>
* 对 {@link IllegalArgumentException} 异常做了写默认处理。
* </p>
*
* <p>
* 将异常信息返回给前端时隐藏掉数据库异常信息中关于数据库结构、SQL 语句的描述。
* </p>
*
* <p>
* 为了避免因为 {@link AllExceptionHandler} 而失效,
* {@code Order} 设置为了 {@value Ordered.LOWEST_PRECEDENCE - 1}。
* 一般 Spring Bean 的 Order 应该是 Ordered.LOWEST_PRECEDENCE
* 所以如果想让自定义的异常处理器与本处理器有冲突,希望覆盖本处理器的行为,
* 需要添加 {@link Order} 注解,将 order 修改为比 {@code Ordered.LOWEST_PRECEDENCE - 1}
* 更小的值,
* 如 0 或者 1甚至是负数。
* </p>
*
* @author <a href="https://gitee.com/zhouxy108">ZhouXY</a>
*/
@RestControllerAdvice
@Order(Ordered.LOWEST_PRECEDENCE - 1)
@Slf4j
public class DefaultExceptionHandler extends BaseExceptionHandler {
public DefaultExceptionHandler(ExceptionInfoHolder exceptionInfoHolder) {
super(exceptionInfoHolder);
set(IllegalArgumentException.class, 4010000, "格式错误", HttpStatus.FORBIDDEN);
set(DataAccessException.class, 6030000, "数据库错误", HttpStatus.INTERNAL_SERVER_ERROR, true);
set(MethodArgumentNotValidException.class,
4040401,
e -> ((MethodArgumentNotValidException) e).getAllErrors()
.stream()
.map(DefaultMessageSourceResolvable::getDefaultMessage)
.toList()
.toString(),
HttpStatus.BAD_REQUEST);
}
@ExceptionHandler(Exception.class)
public ResponseEntity<RestfulResult> handleException(Exception e) {
log.error(e.getMessage(), e);
return buildExceptionResponse(e);
}
}