springboot平常的一些配置
1.mybaits配置
server: tomcat: uri-encoding: UTF-8 max-threads: 1000 min-spare-threads: 30 port: 8080 servlet: context-path: /test spring: profiles: #运行环境 active: dev http: encoding: force: true charset: UTF-8 enabled: true converters.preferred-json-mapper: jackson jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 default-property-inclusion: non_null servlet: multipart: max-file-size: 20MB max-request-size: 20MB enabled: true main: allow-bean-definition-overriding: true mvc: throw-exception-if-no-handler-found: true servlet: load-on-startup: 1 mybatis-plus: mapper-locations: classpath*:/mapper/*/*Mapper.xml typeAliasesPackage: com.guangray.traffic.**.entity type-enums-package: com.guangray.traffic.**.enums global-config: db-config: id-type: assign_id logic-delete-field: is_delete logic-delete-value: 1 logic-not-delete-value: 0 banner: false configuration: map-underscore-to-camel-case: true cache-enabled: false log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl
配置 config
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.util.StrUtil;
import com.guangray.traffic.component.quartz.annotation.QuartzCronScheduled;
import lombok.extern.slf4j.Slf4j;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.PersistJobDataAfterExecution;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.stream.Collectors;
@Slf4j
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
@QuartzCronScheduled(jobName = "taskCreateTable", description = "创建记录表", cronExpression = "0 0 2 * * ? *")
public class TaskCreateTable extends QuartzJobBean {
/**
* 创建玩玩测试记录表模板语句
*/
private static final String CREATE_AUTH_TABLE_SQL = "sql/create_auth_table.sql";
/**
* 创建小天每天比对记录表模板语句
*/
private static final String CREATE_COMPARE_TABLE_SQL = "sql/create_compare_table.sql";
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info("创建记录表定时任务开始,时间:{}", DateUtil.now());
LocalDate now = LocalDate.now();
LocalDate lastDay = now.with(TemporalAdjusters.lastDayOfMonth());
//执行日期为本月最后一天
if (now.isEqual(lastDay)) {
log.info("当前日期为本月最后一天,确认创建分月表");
LocalDate nextMonthFirstDay = now.plusDays(1L);
ClassPathResource authClassPathResource = new ClassPathResource(CREATE_AUTH_TABLE_SQL);
ClassPathResource compareClassPathResource = new ClassPathResource(CREATE_COMPARE_TABLE_SQL);
String authSql = new BufferedReader(new InputStreamReader(authClassPathResource.getStream()))
.lines()
.collect(Collectors.joining(System.lineSeparator()));
String compareSql = new BufferedReader(new InputStreamReader(compareClassPathResource.getStream()))
.lines()
.collect(Collectors.joining(System.lineSeparator()));
String tableSuffix = StrUtil.concat(
true,
String.valueOf(nextMonthFirstDay.getYear()),
String.valueOf(nextMonthFirstDay.getMonthValue())
);
try {
jdbcTemplate.execute(StrUtil.format(authSql, tableSuffix));
} catch (Exception e) {
log.error("玩玩测试记录表创建失败,原因:{}", e.getMessage(), e);
}
try {
jdbcTemplate.execute(StrUtil.format(compareSql, tableSuffix));
} catch (Exception e) {
log.error("小天每天比对记录表创建失败,原因:{}", e.getMessage(), e);
}
}
log.info("创建记录表定时任务结束,时间:{}", DateUtil.now());
}
}
mybaits plus
/** * @author ww * @version v1.0.0 */ @Configuration public class MybatisPlusConfiguration { /** * mybatis-plus分页插件 */ @Bean @ConditionalOnMissingBean(PaginationInterceptor.class) public PaginationInterceptor paginationInterceptor() { PaginationInterceptor page = new PaginationInterceptor(); page.setDialectType("mysql"); return page; } }
异常validate配置
public class ValidatorConfiguration { @Bean public Validator validator() { return Validation.byProvider(HibernateValidator.class).configure().failFast(true).buildValidatorFactory().getValidator(); } }
异常处理类
@RestControllerAdvice(value = "cn.gakm.place") @Slf4j public class GlobalExceptionHandler { /** * 请求方式不被支持异常 * @param e * @return */ @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public Result httpRequestMethodNotSupportedException(Exception e) { log.error("请求方式不被支持异常:{}", e); return Result.fail(DefaultResultCode.HTTP_METHOD_NOT_ALLOWED); } /** * 参数校验异常,如果是hibernate validate的话,只包含实体类异常 * @param e * @return */ @ExceptionHandler({BindException.class, MethodArgumentNotValidException.class}) public Result objectValidExceptionHandler(Exception e) { BindingResult bindResult = null; Result result = Result.fail(DefaultResultCode.PARAM_ERROR); //参数绑定异常 if (e instanceof BindException) { bindResult = ((BindException) e).getBindingResult(); } else if (e instanceof MethodArgumentNotValidException) { bindResult = ((MethodArgumentNotValidException) e).getBindingResult(); } List<FieldError> fieldErrors = bindResult != null ? bindResult.getFieldErrors() : null; LinkedList<String> errorInfo = CollUtil.newLinkedList(); if (CollUtil.isNotEmpty(fieldErrors)) { fieldErrors.forEach(fieldError -> errorInfo.add(fieldError.getField() + ":" + fieldError.getDefaultMessage())); //result.put(Result.KEY_MESSAGE, errorInfo.toString()); result.setMsg(errorInfo.toString()); } log.error("实体接参校验异常:{}", errorInfo.toString()); return result; } /** * 参数校验异常,validate单参数校验异常(@RequestParam, @PathVariable) * 使用方式: 使用类上添加@validate 校验字段使用validator 定义规范 eg:@NotBlank * * @param e * @return */ @ExceptionHandler(ConstraintViolationException.class) public Result paramValidExceptionHandler(ConstraintViolationException e) { Result result = Result.fail(DefaultResultCode.PARAM_ERROR); List<String> errorList = e.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.toList()); String errorInfo = errorList.toString(); log.error("单参数校验异常:{}", errorInfo); result.setMsg(errorInfo); return result; } /** * 其他异常 * * @param e * @return */ @ExceptionHandler(Exception.class) public Result globalException(Exception e) { log.error("其他异常:{}", e); return Result.fail(DefaultResultCode.SYSTEM_ERROR); } /** * 自定义异常 * @param e * @return */ @ExceptionHandler(ApiException.class) public Result customerException(ApiException e) { log.error("自定义异常:{}", e); return e.getResult(); } }
@RestControllerAdvice @Slf4j public class GlobalExceptionHandler { @ExceptionHandler(CustomException.class) public Result eitEntryException(CustomException e) { log.error("自定义异常:{}", e.getMessage()); return Result.fail(e.getCode(), e.getMessage()); } @ExceptionHandler({BindException.class, MethodArgumentNotValidException.class}) public Result objectValidExceptionHandler(Exception e) { BindingResult bindResult = null; Result result = Result.error(CommonResultEnum.ERROR_PARAM_VALIDATOR); if (e instanceof BindException) { bindResult = ((BindException) e).getBindingResult(); } else if (e instanceof MethodArgumentNotValidException) { bindResult = ((MethodArgumentNotValidException) e).getBindingResult(); } List<FieldError> fieldErrors = bindResult != null ? bindResult.getFieldErrors() : null; LinkedList<String> errorInfo = CollUtil.newLinkedList(); if (CollUtil.isNotEmpty(fieldErrors)) { fieldErrors.forEach(fieldError -> errorInfo.add( StrUtil.concat(Boolean.TRUE, fieldError.getField(), StrUtil.COLON, fieldError.getDefaultMessage()) )); result.setMessage(errorInfo.toString()); } log.error("实体接参校验异常:{}", errorInfo.toString()); return result; } @ExceptionHandler(ConstraintViolationException.class) public Result paramValidExceptionHandler(ConstraintViolationException e) { Result result = Result.error(CommonResultEnum.ERROR_PARAM_VALIDATOR); List<String> errorList = e.getConstraintViolations() .stream() .map(ConstraintViolation::getMessage) .collect(Collectors.toList()); String errorInfo = errorList.toString(); result.setMessage(errorInfo); log.error("单参数校验异常:{}", errorInfo); return result; } @ExceptionHandler({HttpMessageNotReadableException.class, JsonParseException.class}) public Result jsonParseException(Exception e) { log.error("json解析异常:{}", e.getMessage()); return Result.error(CommonResultEnum.JSON_PARSE_ERROR); } @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public Result httpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) { return Result.error(CommonResultEnum.HTTP_METHOD_NOT_ALLOWED); } @ExceptionHandler(NoHandlerFoundException.class) public Result noHandlerFoundException(Exception e) { log.error("方法未找到:{}", e.getMessage()); return Result.error(CommonResultEnum.NO_HANDLER_FOUND); } @ExceptionHandler(HttpMediaTypeNotSupportedException.class) public Result httpMediaTypeNotSupportedException(Exception e) { log.error("请求头错误:{}", e.getMessage()); return Result.error(CommonResultEnum.HTTP_MEDIATYPE_NOT_SUPPORTED); } @ExceptionHandler(AuthenticationException.class) public Result authenticationException(AuthenticationException e) { log.error("请求头错误:{}", e.getMessage()); return Result.error(CommonResultEnum.HTTP_MEDIATYPE_NOT_SUPPORTED); } @ExceptionHandler(Exception.class) public Result globalException(Exception e) { log.error("其他异常:{}", e.getMessage()); return resolveException(e); } public static Result resolveException(Exception e) { ResultCode result = CommonResultEnum.ERROR_SERVER; String message = e.getMessage(); String className = e.getClass().getName(); if (className.contains("UsernameNotFoundException")) { result = AuthResultEnum.USERNAME_NOT_FOUND; } else if (className.contains("BadCredentialsException")) { result = AuthResultEnum.BAD_CREDENTIALS; } else if (className.contains("AccountExpiredException")) { result = AuthResultEnum.ACCOUNT_EXPIRED; } else if (className.contains("LockedException")) { result = AuthResultEnum.ACCOUNT_LOCKED; } else if (className.contains("DisabledException")) { result = AuthResultEnum.ACCOUNT_DISABLED; } else if (className.contains("CredentialsExpiredException")) { result = AuthResultEnum.CREDENTIALS_EXPIRED; } else if (className.contains("InvalidClientException")) { result = AuthResultEnum.INVALID_CLIENT; } else if (className.contains("UnauthorizedClientException")) { result = AuthResultEnum.UNAUTHORIZED_CLIENT; } else if (className.contains("InsufficientAuthenticationException") || className.contains("AuthenticationCredentialsNotFoundException")) { result = AuthResultEnum.UNAUTHORIZED; } else if (className.contains("InvalidGrantException")) { if (message.contains("Bad credentials")) { result = AuthResultEnum.BAD_CREDENTIALS; } else if (message.contains("User is disabled")) { result = AuthResultEnum.ACCOUNT_DISABLED; } else if (message.contains("User account is locked")) { result = AuthResultEnum.ACCOUNT_LOCKED; } else if (message.contains("Invalid refresh token")) { result = AuthResultEnum.INVALID_REFRESH_TOKEN; } } else if (className.contains("InvalidScopeException")) { result = AuthResultEnum.INVALID_SCOPE; } else if (className.contains("InvalidTokenException")) { result = AuthResultEnum.INVALID_TOKEN; } else if (className.contains("InvalidRequestException")) { result = AuthResultEnum.INVALID_REQUEST; } else if (className.contains("RedirectMismatchException")) { result = AuthResultEnum.REDIRECT_URI_MISMATCH; } else if (className.contains("UnsupportedGrantTypeException")) { result = AuthResultEnum.UNSUPPORTED_GRANT_TYPE; } else if (className.contains("UnsupportedResponseTypeException")) { result = AuthResultEnum.UNSUPPORTED_RESPONSE_TYPE; } else if (className.contains("UserDeniedAuthorizationException")) { result = AuthResultEnum.ACCESS_DENIED; } else if (className.contains("AccessDeniedException")) { result = AuthResultEnum.ACCESS_DENIED; if (AuthResultEnum.ACCESS_DENIED_BLACK_LIMITED.getMessage().contains(message)) { result = AuthResultEnum.ACCESS_DENIED_BLACK_LIMITED; } else if (AuthResultEnum.ACCESS_DENIED_WHITE_LIMITED.getMessage().contains(message)) { result = AuthResultEnum.ACCESS_DENIED_WHITE_LIMITED; } else if (AuthResultEnum.ACCESS_DENIED_AUTHORITY_EXPIRED.getMessage().contains(message)) { result = AuthResultEnum.ACCESS_DENIED_AUTHORITY_EXPIRED; } else if (AuthResultEnum.ACCESS_DENIED_UPDATING.getMessage().contains(message)) { result = AuthResultEnum.ACCESS_DENIED_UPDATING; } else if (AuthResultEnum.ACCESS_DENIED_DISABLED.getMessage().contains(message)) { result = AuthResultEnum.ACCESS_DENIED_DISABLED; } else if (AuthResultEnum.ACCESS_DENIED_NOT_OPEN.getMessage().contains(message)) { result = AuthResultEnum.ACCESS_DENIED_NOT_OPEN; } } return Result.error(result); } }
@Getter @Setter public class CustomException extends RuntimeException { private static final long serialVersionUID = 8850249886493567889L; private int code = 500; private String message; public CustomException() { super(); } public CustomException(ResultCode resultCode) { this.code = resultCode.getCode(); this.message = resultCode.getMessage(); } public CustomException(String message) { this.message = message; } }
Thread 线程池设置
/** * 线程工厂 * * @author test * @date 2020-05-07 */ public class MyThreadFactory implements ThreadFactory { private static final AtomicInteger POOL_NUMBER = new AtomicInteger(1); private final ThreadGroup group; private final AtomicInteger threadNumber = new AtomicInteger(1); private final String namePrefix; MyThreadFactory() { SecurityManager securityManager = System.getSecurityManager(); group = (securityManager != null) ? securityManager.getThreadGroup() : Thread.currentThread().getThreadGroup(); namePrefix = StrUtil.concat(true, "MyThreadPool-", String.valueOf(POOL_NUMBER.getAndIncrement()), "-thread-"); } @Override public Thread newThread(Runnable runnable) { Thread thread = new Thread(group, runnable, namePrefix + threadNumber.getAndIncrement(), 0); if (thread.isDaemon()) { thread.setDaemon(false); } if (thread.getPriority() != Thread.NORM_PRIORITY) { thread.setPriority(Thread.NORM_PRIORITY); } return thread; } }
/** * 线程池管理 * * @author test * @date 2020-02-25 */ public class ThreadManager { private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(10, new MyThreadFactory()); private ThreadManager() { } private static ThreadManager threadManager = new ThreadManager(); public static ThreadManager getThreadManager() { return threadManager; } public void execute(Callable callable) { executor.submit(callable); } public void execute(FutureTask futureTask) { executor.submit(futureTask); } public void execute(Runnable runnable) { executor.submit(runnable); } }
常量设置
public class SysConstants { /** * 验证码 */ public interface VerificationCode{ /** * 验证码 redis key 前缀 */ String REDIS_KEY_PREFIX="verification:"; } }
浙公网安备 33010602011771号