From 1c8280677fb7d92cd88c94b113f8b840b829bf63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 1 Dec 2022 15:46:56 +0800 Subject: [PATCH 001/204] bump springboot from 2.3.12.RELEASE to 3.0.0 --- .../app/controller/ExceptionController.java | 2 +- .../app/controller/TranscationController.java | 2 +- .../dream/app/controller/UserController.java | 2 +- .../servlet/AsyncRunningServlet.java | 14 +-- .../app/controller/servlet/AsyncServlet.java | 12 +- .../servlet/MyTestReadListener.java | 6 +- .../hxy/dream/app/entity/param/UserParam.java | 4 +- .../dream/app/service/TransactionService.java | 2 +- .../app/service/TransactionSubService.java | 2 +- .../app/service/impl/UserServiceImpl.java | 2 +- app/src/main/resources/logback-dev.xml | 111 ------------------ .../{logback.xml => logback-spring.xml} | 0 .../hxy/dream/app/service/impl/EnumTest.java | 2 +- build.gradle | 10 +- .../common/configuration/AsyncConfig.java | 2 +- .../common/extend/GlobalExceptionHandler.java | 10 +- .../dream/common/extend/ParameterRecord.java | 4 +- .../hxy/dream/common/filter/TokenFilter.java | 16 +-- .../common/serializer/ReflectionUtils.java | 11 +- .../java/hxy/dream/common/util/IPAddress.java | 2 +- dao/src/main/java/hxy/dream/dao/UserDao.java | 2 +- entity/build.gradle | 2 + gradle/wrapper/gradle-wrapper.properties | 2 +- 23 files changed, 61 insertions(+), 161 deletions(-) delete mode 100755 app/src/main/resources/logback-dev.xml rename app/src/main/resources/{logback.xml => logback-spring.xml} (100%) diff --git a/app/src/main/java/hxy/dream/app/controller/ExceptionController.java b/app/src/main/java/hxy/dream/app/controller/ExceptionController.java index 32e575b..2dac4d5 100644 --- a/app/src/main/java/hxy/dream/app/controller/ExceptionController.java +++ b/app/src/main/java/hxy/dream/app/controller/ExceptionController.java @@ -5,7 +5,7 @@ import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; /** diff --git a/app/src/main/java/hxy/dream/app/controller/TranscationController.java b/app/src/main/java/hxy/dream/app/controller/TranscationController.java index 1f597bd..b496597 100644 --- a/app/src/main/java/hxy/dream/app/controller/TranscationController.java +++ b/app/src/main/java/hxy/dream/app/controller/TranscationController.java @@ -7,7 +7,7 @@ import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; diff --git a/app/src/main/java/hxy/dream/app/controller/UserController.java b/app/src/main/java/hxy/dream/app/controller/UserController.java index cc3b1c6..b4844f7 100644 --- a/app/src/main/java/hxy/dream/app/controller/UserController.java +++ b/app/src/main/java/hxy/dream/app/controller/UserController.java @@ -17,7 +17,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import javax.validation.Valid; +import jakarta.validation.Valid; import java.util.List; /** diff --git a/app/src/main/java/hxy/dream/app/controller/servlet/AsyncRunningServlet.java b/app/src/main/java/hxy/dream/app/controller/servlet/AsyncRunningServlet.java index 2f11613..391d3aa 100644 --- a/app/src/main/java/hxy/dream/app/controller/servlet/AsyncRunningServlet.java +++ b/app/src/main/java/hxy/dream/app/controller/servlet/AsyncRunningServlet.java @@ -4,13 +4,13 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; -import javax.servlet.AsyncContext; -import javax.servlet.ServletException; -import javax.servlet.ServletInputStream; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.AsyncContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; diff --git a/app/src/main/java/hxy/dream/app/controller/servlet/AsyncServlet.java b/app/src/main/java/hxy/dream/app/controller/servlet/AsyncServlet.java index 00b2951..5e0f0dd 100644 --- a/app/src/main/java/hxy/dream/app/controller/servlet/AsyncServlet.java +++ b/app/src/main/java/hxy/dream/app/controller/servlet/AsyncServlet.java @@ -6,12 +6,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; -import javax.servlet.AsyncContext; -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.AsyncContext; +import jakarta.servlet.ServletException; +import jakarta.servlet.annotation.WebServlet; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; diff --git a/app/src/main/java/hxy/dream/app/controller/servlet/MyTestReadListener.java b/app/src/main/java/hxy/dream/app/controller/servlet/MyTestReadListener.java index 1ae37d4..6568d17 100644 --- a/app/src/main/java/hxy/dream/app/controller/servlet/MyTestReadListener.java +++ b/app/src/main/java/hxy/dream/app/controller/servlet/MyTestReadListener.java @@ -4,9 +4,9 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.AsyncContext; -import javax.servlet.ReadListener; -import javax.servlet.ServletInputStream; +import jakarta.servlet.AsyncContext; +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; diff --git a/app/src/main/java/hxy/dream/app/entity/param/UserParam.java b/app/src/main/java/hxy/dream/app/entity/param/UserParam.java index bf330b2..09b813f 100644 --- a/app/src/main/java/hxy/dream/app/entity/param/UserParam.java +++ b/app/src/main/java/hxy/dream/app/entity/param/UserParam.java @@ -3,8 +3,8 @@ package hxy.dream.app.entity.param; import hxy.dream.entity.enums.GenderEnum; import lombok.Data; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; /** * @author iris diff --git a/app/src/main/java/hxy/dream/app/service/TransactionService.java b/app/src/main/java/hxy/dream/app/service/TransactionService.java index a06bf6f..e232fd4 100644 --- a/app/src/main/java/hxy/dream/app/service/TransactionService.java +++ b/app/src/main/java/hxy/dream/app/service/TransactionService.java @@ -10,7 +10,7 @@ import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; /** * 事物测试 diff --git a/app/src/main/java/hxy/dream/app/service/TransactionSubService.java b/app/src/main/java/hxy/dream/app/service/TransactionSubService.java index 5a6dc05..8ffa161 100644 --- a/app/src/main/java/hxy/dream/app/service/TransactionSubService.java +++ b/app/src/main/java/hxy/dream/app/service/TransactionSubService.java @@ -6,7 +6,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; -import javax.annotation.Resource; +import jakarta.annotation.Resource; /** * @author eric diff --git a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java index eb8271f..9777b9c 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java @@ -10,7 +10,7 @@ import hxy.dream.entity.vo.BaseResponseVO; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.List; /** diff --git a/app/src/main/resources/logback-dev.xml b/app/src/main/resources/logback-dev.xml deleted file mode 100755 index adee638..0000000 --- a/app/src/main/resources/logback-dev.xml +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - %d{HH:mm:ss.SSS} %contextName [%thread] %highlight(%-5level) %yellow(at %class.%method) \(%file:%line\) - %msg%n - - - - - - - - - - - DEBUG - ACCEPT - DENY - - ${LOG_HOME}/debug.log - - - - - ${LOG_HOME}/debug.%d{yyyy-MM-dd}.%i.log - - 180 - - - - 10MB - - - - %date %level [%thread] %logger{36} [%file : %line] %msg%n - - - - - - - INFO - ACCEPT - DENY - - ${LOG_HOME}/info.log - - ${LOG_HOME}/info.%d{yyyy-MM-dd}.%i.log - 60 - - 10MB - - - - %date %level [%thread] %logger{36} [%file : %line] %msg%n - - - - - WARN - ACCEPT - DENY - - ${LOG_HOME}/warn.log - - ${LOG_HOME}/warn.%d{yyyy-MM-dd}.%i.log - 60 - - 10MB - - - - %date %level [%thread] %logger{36} [%file : %line] %msg%n - - - - - ERROR - ACCEPT - DENY - - ${LOG_HOME}/error.log - - ${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log - 60 - - 10MB - - - - %date %level [%thread] %logger{36} [%file : %line] %msg%n - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/resources/logback.xml b/app/src/main/resources/logback-spring.xml similarity index 100% rename from app/src/main/resources/logback.xml rename to app/src/main/resources/logback-spring.xml diff --git a/app/src/test/java/hxy/dream/app/service/impl/EnumTest.java b/app/src/test/java/hxy/dream/app/service/impl/EnumTest.java index a781f64..a768b58 100644 --- a/app/src/test/java/hxy/dream/app/service/impl/EnumTest.java +++ b/app/src/test/java/hxy/dream/app/service/impl/EnumTest.java @@ -7,7 +7,7 @@ import hxy.dream.BaseTest; import hxy.dream.entity.enums.GenderEnum; import org.junit.Test; -import javax.annotation.Resource; +import jakarta.annotation.Resource; /** * @author eric diff --git a/build.gradle b/build.gradle index fdc4602..475df6f 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '2.3.12.RELEASE' + springBootVersion = '3.0.0' } repositories { mavenLocal() @@ -33,6 +33,7 @@ buildscript { plugins { + id 'io.spring.dependency-management' version '1.1.0' id 'java-library' id 'idea' id "com.google.cloud.tools.jib" version "2.0.0" @@ -67,6 +68,9 @@ allprojects { if (version.endsWith('-SNAPSHOT')) { maven { url "https://repo.spring.io/snapshot" } } + + // 临时解决mybatis没有适配 SpringBoot3.0问题 + maven { name "OSS Snapshot repository"; url "https://oss.sonatype.org/content/repositories/snapshots/" } } configurations.all { @@ -93,8 +97,8 @@ subprojects { group = 'hxy.dream' version = '1.0-SNAPSHOT' /* 指定jdk版本 */ - sourceCompatibility = 11 - targetCompatibility = 11 + sourceCompatibility = 17 + targetCompatibility = 17 /* java编译的时候缺省状态下会因为中文字符而失败 */ [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' diff --git a/common/src/main/java/hxy/dream/common/configuration/AsyncConfig.java b/common/src/main/java/hxy/dream/common/configuration/AsyncConfig.java index 795241e..8c927fd 100644 --- a/common/src/main/java/hxy/dream/common/configuration/AsyncConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/AsyncConfig.java @@ -9,7 +9,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.DispatcherServlet; -import javax.servlet.MultipartConfigElement; +import jakarta.servlet.MultipartConfigElement; /** * @author eric diff --git a/common/src/main/java/hxy/dream/common/extend/GlobalExceptionHandler.java b/common/src/main/java/hxy/dream/common/extend/GlobalExceptionHandler.java index d4c90ad..b67549c 100644 --- a/common/src/main/java/hxy/dream/common/extend/GlobalExceptionHandler.java +++ b/common/src/main/java/hxy/dream/common/extend/GlobalExceptionHandler.java @@ -24,11 +24,11 @@ import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.NoHandlerFoundException; import org.springframework.web.servlet.view.json.MappingJackson2JsonView; -import javax.annotation.PostConstruct; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.validation.ConstraintViolationException; -import javax.validation.ValidationException; +import jakarta.annotation.PostConstruct; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.ConstraintViolationException; +import jakarta.validation.ValidationException; import java.io.IOException; import java.util.Map; diff --git a/common/src/main/java/hxy/dream/common/extend/ParameterRecord.java b/common/src/main/java/hxy/dream/common/extend/ParameterRecord.java index aade4ae..8e0e1ca 100644 --- a/common/src/main/java/hxy/dream/common/extend/ParameterRecord.java +++ b/common/src/main/java/hxy/dream/common/extend/ParameterRecord.java @@ -21,8 +21,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import javax.servlet.ServletInputStream; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; diff --git a/common/src/main/java/hxy/dream/common/filter/TokenFilter.java b/common/src/main/java/hxy/dream/common/filter/TokenFilter.java index fd0f2f0..2a3156b 100644 --- a/common/src/main/java/hxy/dream/common/filter/TokenFilter.java +++ b/common/src/main/java/hxy/dream/common/filter/TokenFilter.java @@ -4,14 +4,14 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.annotation.WebFilter; -import javax.servlet.annotation.WebInitParam; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.annotation.WebFilter; +import jakarta.servlet.annotation.WebInitParam; import java.io.IOException; /** diff --git a/common/src/main/java/hxy/dream/common/serializer/ReflectionUtils.java b/common/src/main/java/hxy/dream/common/serializer/ReflectionUtils.java index 64fb22f..bc85093 100644 --- a/common/src/main/java/hxy/dream/common/serializer/ReflectionUtils.java +++ b/common/src/main/java/hxy/dream/common/serializer/ReflectionUtils.java @@ -9,11 +9,16 @@ import org.aspectj.lang.JoinPoint; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.aop.framework.Advised; import org.springframework.core.BridgeMethodResolver; -import org.springframework.core.LocalVariableTableParameterNameDiscoverer; import org.springframework.core.ParameterNameDiscoverer; +import org.springframework.core.StandardReflectionParameterNameDiscoverer; import java.lang.annotation.Annotation; -import java.lang.reflect.*; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -25,7 +30,7 @@ import java.util.List; */ public class ReflectionUtils { - public static ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer(); + public static ParameterNameDiscoverer parameterNameDiscoverer = new StandardReflectionParameterNameDiscoverer(); // javassist.ClassPool dubbo中包含此包 private static ClassPool classPool = ClassPool.getDefault(); diff --git a/common/src/main/java/hxy/dream/common/util/IPAddress.java b/common/src/main/java/hxy/dream/common/util/IPAddress.java index 51671f3..f29936d 100644 --- a/common/src/main/java/hxy/dream/common/util/IPAddress.java +++ b/common/src/main/java/hxy/dream/common/util/IPAddress.java @@ -3,7 +3,7 @@ package hxy.dream.common.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.UnknownHostException; diff --git a/dao/src/main/java/hxy/dream/dao/UserDao.java b/dao/src/main/java/hxy/dream/dao/UserDao.java index 9786456..f22b270 100644 --- a/dao/src/main/java/hxy/dream/dao/UserDao.java +++ b/dao/src/main/java/hxy/dream/dao/UserDao.java @@ -5,7 +5,7 @@ import hxy.dream.dao.mapper.UserMapper; import hxy.dream.dao.model.UserModel; import org.springframework.stereotype.Component; -import javax.annotation.Resource; +import jakarta.annotation.Resource; import java.util.List; /** diff --git a/entity/build.gradle b/entity/build.gradle index 60cc64a..a8d23e0 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -9,6 +9,8 @@ dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api api 'com.baomidou:mybatis-plus-boot-starter:3.5.1' + api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0-SNAPSHOT' api 'org.springframework.boot:spring-boot-starter-validation' + } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 69a9715..ae04661 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -- Gitee From 9289226dff141d96c0b9695b46079ff5ff97a19f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 1 Dec 2022 16:06:41 +0800 Subject: [PATCH 002/204] =?UTF-8?q?=E5=A3=B0=E6=98=8E=E5=BC=8FAPI=E7=BB=83?= =?UTF-8?q?=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../dream/common/manager/RemoteApiTest.java | 23 +++++++++++++++++++ build.gradle | 2 ++ .../common/configuration/RemoteApiConfig.java | 22 ++++++++++++++++++ .../hxy/dream/common/manager/RemoteApi.java | 19 +++++++++++++++ .../common/manager/RemoteApiService.java | 14 ----------- 6 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 app/src/test/java/hxy/dream/common/manager/RemoteApiTest.java create mode 100644 common/src/main/java/hxy/dream/common/configuration/RemoteApiConfig.java create mode 100644 common/src/main/java/hxy/dream/common/manager/RemoteApi.java delete mode 100644 common/src/main/java/hxy/dream/common/manager/RemoteApiService.java diff --git a/README.md b/README.md index 8d81920..64b6fba 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ logback邮件通知 | 默认支持 全局异常捕获 | 默认支持 | 捕获异常 数据库字段加解密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 给部分数据库字段加解密 执行SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | - +SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | 具体框架如下表: diff --git a/app/src/test/java/hxy/dream/common/manager/RemoteApiTest.java b/app/src/test/java/hxy/dream/common/manager/RemoteApiTest.java new file mode 100644 index 0000000..3d7b4e4 --- /dev/null +++ b/app/src/test/java/hxy/dream/common/manager/RemoteApiTest.java @@ -0,0 +1,23 @@ +package hxy.dream.common.manager; + + +import hxy.dream.BaseTest; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +@Slf4j +public class RemoteApiTest extends BaseTest { + + + @Autowired + private RemoteApi remoteApi; + + @Test + public void testGet() { + String body = remoteApi.getBody(); + log.info("{}", body); + } + + +} diff --git a/build.gradle b/build.gradle index 475df6f..98c3c89 100644 --- a/build.gradle +++ b/build.gradle @@ -125,11 +125,13 @@ subprojects { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'org.springframework.boot:spring-boot-starter-webflux' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' + testImplementation 'io.projectreactor:reactor-test' // https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-sentinel // compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-alibaba-sentinel', version: '0.9.0.RELEASE' diff --git a/common/src/main/java/hxy/dream/common/configuration/RemoteApiConfig.java b/common/src/main/java/hxy/dream/common/configuration/RemoteApiConfig.java new file mode 100644 index 0000000..403a007 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/configuration/RemoteApiConfig.java @@ -0,0 +1,22 @@ +package hxy.dream.common.configuration; + + +import hxy.dream.common.manager.RemoteApi; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.reactive.function.client.support.WebClientAdapter; +import org.springframework.web.service.invoker.HttpServiceProxyFactory; + +@Configuration(proxyBeanMethods = false) +public class RemoteApiConfig { + + @Bean + RemoteApi remoteApiService() { + WebClient client = WebClient.builder().baseUrl("https://httpbin.org/").build(); + HttpServiceProxyFactory httpServiceProxyFactory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build(); + // 后期会自动扫描注入,不需要手动指定注入了。但是上面host配置肯定还是需要的。 + return httpServiceProxyFactory.createClient(RemoteApi.class); + } + +} diff --git a/common/src/main/java/hxy/dream/common/manager/RemoteApi.java b/common/src/main/java/hxy/dream/common/manager/RemoteApi.java new file mode 100644 index 0000000..b69b326 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/manager/RemoteApi.java @@ -0,0 +1,19 @@ +package hxy.dream.common.manager; + +import org.springframework.web.service.annotation.GetExchange; +import org.springframework.web.service.annotation.HttpExchange; + +/** + * 通过RPC/Http调用远程的服务请求 + * @author iris + */ +@HttpExchange +public interface RemoteApi { + + /** + * @return 声明式HTTP客户端 + */ + @GetExchange("/get") + String getBody(); + +} diff --git a/common/src/main/java/hxy/dream/common/manager/RemoteApiService.java b/common/src/main/java/hxy/dream/common/manager/RemoteApiService.java deleted file mode 100644 index 23ef20e..0000000 --- a/common/src/main/java/hxy/dream/common/manager/RemoteApiService.java +++ /dev/null @@ -1,14 +0,0 @@ -package hxy.dream.common.manager; - -import org.springframework.stereotype.Component; - -/** - * 通过RPC/Http调用远程的服务请求 - * @author iris - */ -@Component -public class RemoteApiService { - - - -} -- Gitee From 24fafc6c7e5d5743991b05edf04c6712094f4531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 1 Dec 2022 16:17:08 +0800 Subject: [PATCH 003/204] =?UTF-8?q?=E5=A3=B0=E6=98=8E=E5=BC=8FAPI=E7=BB=83?= =?UTF-8?q?=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asset/logback-dev.xml | 111 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100755 asset/logback-dev.xml diff --git a/asset/logback-dev.xml b/asset/logback-dev.xml new file mode 100755 index 0000000..adee638 --- /dev/null +++ b/asset/logback-dev.xml @@ -0,0 +1,111 @@ + + + + + + + + + + + + + %d{HH:mm:ss.SSS} %contextName [%thread] %highlight(%-5level) %yellow(at %class.%method) \(%file:%line\) - %msg%n + + + + + + + + + + + DEBUG + ACCEPT + DENY + + ${LOG_HOME}/debug.log + + + + + ${LOG_HOME}/debug.%d{yyyy-MM-dd}.%i.log + + 180 + + + + 10MB + + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + + + INFO + ACCEPT + DENY + + ${LOG_HOME}/info.log + + ${LOG_HOME}/info.%d{yyyy-MM-dd}.%i.log + 60 + + 10MB + + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + WARN + ACCEPT + DENY + + ${LOG_HOME}/warn.log + + ${LOG_HOME}/warn.%d{yyyy-MM-dd}.%i.log + 60 + + 10MB + + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + ERROR + ACCEPT + DENY + + ${LOG_HOME}/error.log + + ${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log + 60 + + 10MB + + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + + + + + + + + + + \ No newline at end of file -- Gitee From 22ba2ac77480ed67dd617a5aca979e6df232a326 Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Wed, 21 Dec 2022 18:39:32 +0800 Subject: [PATCH 004/204] p6spy --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 98c3c89..79dfad9 100644 --- a/build.gradle +++ b/build.gradle @@ -125,6 +125,8 @@ subprojects { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'com.zaxxer:HikariCP:5.0.1' + implementation 'p6spy:p6spy:3.9.1' implementation 'org.springframework.boot:spring-boot-starter-webflux' compileOnly 'org.projectlombok:lombok' -- Gitee From 5874ea2fc58d9794426154ee2789c376ed54db5f Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Wed, 21 Dec 2022 18:53:38 +0800 Subject: [PATCH 005/204] bump mybatis-plus from 3.5.1 to 3.5.2.7-SNAPSHOT --- app/src/main/resources/spy.properties | 24 +++++++++++++++++++ .../configuration/MybatisAuditHandler.java | 16 ++++++++----- entity/build.gradle | 2 +- 3 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 app/src/main/resources/spy.properties diff --git a/app/src/main/resources/spy.properties b/app/src/main/resources/spy.properties new file mode 100644 index 0000000..af0bb2a --- /dev/null +++ b/app/src/main/resources/spy.properties @@ -0,0 +1,24 @@ +#3.2.1以上使用 +modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory +#3.2.1以下使用或者不配置 +#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory +# 自定义日志打印 +logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger +#日志输出到控制台 +appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger +# 使用日志系统记录 sql +#appender=com.p6spy.engine.spy.appender.Slf4JLogger +# 设置 p6spy driver 代理 +deregisterdrivers=true +# 取消JDBC URL前缀 +useprefix=true +# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset. +excludecategories=info,debug,result,commit,resultset +# 日期格式 +dateformat=yyyy-MM-dd HH:mm:ss +# 实际驱动可多个 +#driverlist=org.h2.Driver +# 是否开启慢SQL记录 +outagedetection=true +# 慢SQL记录标准 2 秒 +outagedetectioninterval=2 \ No newline at end of file diff --git a/common/src/main/java/hxy/dream/common/configuration/MybatisAuditHandler.java b/common/src/main/java/hxy/dream/common/configuration/MybatisAuditHandler.java index 11cabe6..8b63d18 100644 --- a/common/src/main/java/hxy/dream/common/configuration/MybatisAuditHandler.java +++ b/common/src/main/java/hxy/dream/common/configuration/MybatisAuditHandler.java @@ -17,25 +17,29 @@ public class MybatisAuditHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { - if (LOG.isDebugEnabled()){ - LOG.debug("\n====>mybatis自动填充创建时间字段"); + LocalDateTime now = LocalDateTime.now(); + + if (LOG.isDebugEnabled()) { + LOG.debug("\n====>mybatis自动填充创建时间字段 ,当前时间 {}", now); } // 声明自动填充字段的逻辑。 // String userId = AuthHolder.getCurrentUserId(); String userId = ""; // this.strictInsertFill(metaObject,"creator",String.class, userId); - this.strictInsertFill(metaObject,"createTime", LocalDateTime.class,LocalDateTime.now()); + this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, now); } @Override public void updateFill(MetaObject metaObject) { - if (LOG.isDebugEnabled()){ - LOG.debug("\n====>mybatis自动填充更新时间字段"); + LocalDateTime now = LocalDateTime.now(); + + if (LOG.isDebugEnabled()) { + LOG.debug("\n====>mybatis自动填充更新时间字段 ,当前时间 {}", now); } // 声明自动填充字段的逻辑。 // String userId = AuthHolder.getCurrentUserId(); String userId = ""; // this.strictUpdateFill(metaObject,"updater",String.class,userId); - this.strictUpdateFill(metaObject,"updateTime", LocalDateTime.class,LocalDateTime.now()); + this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, now); } } \ No newline at end of file diff --git a/entity/build.gradle b/entity/build.gradle index a8d23e0..3d67b0e 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,7 +8,7 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-boot-starter:3.5.1' + api 'com.baomidou:mybatis-plus-boot-starter:3.5.2.7-SNAPSHOT' api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0-SNAPSHOT' api 'org.springframework.boot:spring-boot-starter-validation' -- Gitee From 61bc6b146f0228e0f613fce9b607edf0405cfe61 Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Wed, 21 Dec 2022 18:56:19 +0800 Subject: [PATCH 006/204] =?UTF-8?q?RestTemplate=E6=88=96=E8=80=85WebClient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 64b6fba..cec5488 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,13 @@ logback邮件通知 | 默认支持 SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | 具体框架如下表: +### OpenFeign要退出历史舞台了 + +推荐 RestTemplate或者WebClient + +WebClient 声明式的API调用: +[RemoteApiConfig](common/src/main/java/hxy/dream/common/configuration/RemoteApiConfig.java) + ## structure -- Gitee From b5b850c9a133a54aa25dcea7d010a61added2aab Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Thu, 29 Dec 2022 10:30:33 +0800 Subject: [PATCH 007/204] bump mybatis-plus-boot-starter from 3.5.2 to 3.5.3 --- entity/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entity/build.gradle b/entity/build.gradle index 3d67b0e..9946c0f 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,7 +8,7 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-boot-starter:3.5.2.7-SNAPSHOT' + api 'com.baomidou:mybatis-plus-boot-starter:3.5.3' api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0-SNAPSHOT' api 'org.springframework.boot:spring-boot-starter-validation' -- Gitee From d05a1a47456654bfc76ff244bf6cdf5319720a9c Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Thu, 29 Dec 2022 10:39:47 +0800 Subject: [PATCH 008/204] =?UTF-8?q?=20mybatis-plus-boot-starter=20?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E8=87=AA=E5=8A=A8=E7=BB=B4=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 98 +++++++++++-------- .../common/init/ApplicationStartupRunner.java | 2 +- .../java/hxy/dream/common/init/MysqlDdl.java | 25 +++++ 3 files changed, 81 insertions(+), 44 deletions(-) create mode 100644 common/src/main/java/hxy/dream/common/init/MysqlDdl.java diff --git a/README.md b/README.md index cec5488..483daa9 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,24 @@ Eric-Dream === -本工程承担日常实验的作用,任何先行的尝试都在这里实践与落地。成熟的方案设计会在 [base-server](https://gitee.com/aohanhongzhi/springboot-base) 里面落地到生产。 +本工程承担日常实验的作用,任何先行的尝试都在这里实践与落地。成熟的方案设计会在 [base-server](https://gitee.com/aohanhongzhi/springboot-base) +里面落地到生产。 - -本项目是基于Gradle构建的多模块SpringCloud工程。采用`传统线程模型`的SpringWeb框架,mybatis-plus和mysql官方驱动。非常适合入门者学习。本项目的一大亮点就是自定义枚举序列化的处理。 +本项目是基于Gradle构建的多模块SpringCloud工程。采用`传统线程模型` +的SpringWeb框架,mybatis-plus和mysql官方驱动。非常适合入门者学习。本项目的一大亮点就是自定义枚举序列化的处理。 ## 主要实现功能如下 - 功能 | 实现 | 用途 ---- |-----------------------------------------------------------------------------------------------------| --- -jackson序列化 | 自定义序列化器 | 解决参数枚举的序列化问题 -logback钉钉通知 | 自定义Appender | Error消息及时通知 -logback邮件通知 | 默认支持 | Error异常及时通知 -全局异常捕获 | 默认支持 | 捕获异常 -数据库字段加解密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 给部分数据库字段加解密 -执行SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | -SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | + + 功能 | 实现 | 用途 +-----------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------|-------------- + jackson序列化 | 自定义序列化器 | 解决参数枚举的序列化问题 + logback钉钉通知 | 自定义Appender | Error消息及时通知 + logback邮件通知 | 默认支持 | Error异常及时通知 + 全局异常捕获 | 默认支持 | 捕获异常 + 数据库字段加解密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 给部分数据库字段加解密 + 执行SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | + [MybatisPlus的SQL脚本自动维护](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) | https://baomidou.com/pages/1812u1/ | 自动建表 + SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | + 具体框架如下表: ### OpenFeign要退出历史舞台了 @@ -24,7 +28,6 @@ SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/jav WebClient 声明式的API调用: [RemoteApiConfig](common/src/main/java/hxy/dream/common/configuration/RemoteApiConfig.java) - ## structure ``` @@ -36,6 +39,7 @@ eric-dream ├── common -- 公共,配置文件,脚手架等 └── dao -- 数据持久层 ``` + 上面后缀server是服务治理模块。platform是业务应用模块。 **微服务=分布式开发+服务治理** ## gradle安装与配置 @@ -46,48 +50,51 @@ https://hub.fastgit.org/GradleCN/GradleSide ![](./asset/img/gradle-special-location.png) ![](./asset/img/gradle-wrapper.png) - -技术 | 说明 | 官网 -----|----|---- -Spring Boot | 容器+MVC框架 | [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot) -Gradle | 项目构建工具 | [https://gradle.com/](https://gradle.com/) -Spring Security | 认证和授权框架 | [https://spring.io/projects/spring-security](https://spring.io/projects/spring-security) -MyBatis | ORM框架 | [http://www.mybatis.org/mybatis-3/zh/index.html](http://www.mybatis.org/mybatis-3/zh/index.html) -MyBatisPlus |ORM框架补充 | [https://mybatis.plus/](https://mybatis.plus/) -MyBatisGenerator | 数据层代码生成 | [http://www.mybatis.org/generator/index.html](http://www.mybatis.org/generator/index.html) -Swagger-UI | 文档生产工具 | [https://github.com/swagger-api/swagger-ui](https://github.com/swagger-api/swagger-ui) -Hibernator-Validator | 验证框架 | [http://hibernate.org/validator/](http://hibernate.org/validator/) -Elasticsearch | 搜索引擎 | [https://github.com/elastic/elasticsearch](https://github.com/elastic/elasticsearch) -RabbitMq | 消息队列 | [https://www.rabbitmq.com/](https://www.rabbitmq.com/) -Redis | 分布式缓存 | [https://redis.io/](https://redis.io/) -redisson | 分布式锁,布隆过滤器 | https://github.com/redisson/redisson -MongoDb | NoSql数据库 | [https://www.mongodb.com/](https://www.mongodb.com/) -Docker | 应用容器引擎 | [https://www.docker.com/](https://www.docker.com/) -Hikari | SpringBoot默认数据库连接池 | [https://github.com/brettwooldridge/HikariCP](https://github.com/brettwooldridge/HikariCP) -Druid | 数据库连接池 | [https://github.com/alibaba/druid](https://github.com/alibaba/druid) -JWT | JWT登录支持 | [https://github.com/jwtk/jjwt](https://github.com/jwtk/jjwt) -LogStash | 日志收集 | [https://github.com/logstash/logstash-logback-encoder](https://github.com/logstash/logstash-logback-encoder) -Lombok | 简化对象封装工具 | [https://github.com/rzwitserloot/lombok](https://github.com/rzwitserloot/lombok) -loc |代码行数统计 | https://github.com/cgag/loc + 技术 | 说明 | 官网 +----------------------|--------------------|-------------------------------------------------------------------------------------------------------------- + Spring Boot | 容器+MVC框架 | [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot) + Gradle | 项目构建工具 | [https://gradle.com/](https://gradle.com/) + Spring Security | 认证和授权框架 | [https://spring.io/projects/spring-security](https://spring.io/projects/spring-security) + MyBatis | ORM框架 | [http://www.mybatis.org/mybatis-3/zh/index.html](http://www.mybatis.org/mybatis-3/zh/index.html) + MyBatisPlus | ORM框架补充 | [https://mybatis.plus/](https://mybatis.plus/) + MyBatisGenerator | 数据层代码生成 | [http://www.mybatis.org/generator/index.html](http://www.mybatis.org/generator/index.html) + Swagger-UI | 文档生产工具 | [https://github.com/swagger-api/swagger-ui](https://github.com/swagger-api/swagger-ui) + Hibernator-Validator | 验证框架 | [http://hibernate.org/validator/](http://hibernate.org/validator/) + Elasticsearch | 搜索引擎 | [https://github.com/elastic/elasticsearch](https://github.com/elastic/elasticsearch) + RabbitMq | 消息队列 | [https://www.rabbitmq.com/](https://www.rabbitmq.com/) + Redis | 分布式缓存 | [https://redis.io/](https://redis.io/) + redisson | 分布式锁,布隆过滤器 | https://github.com/redisson/redisson + MongoDb | NoSql数据库 | [https://www.mongodb.com/](https://www.mongodb.com/) + Docker | 应用容器引擎 | [https://www.docker.com/](https://www.docker.com/) + Hikari | SpringBoot默认数据库连接池 | [https://github.com/brettwooldridge/HikariCP](https://github.com/brettwooldridge/HikariCP) + Druid | 数据库连接池 | [https://github.com/alibaba/druid](https://github.com/alibaba/druid) + JWT | JWT登录支持 | [https://github.com/jwtk/jjwt](https://github.com/jwtk/jjwt) + LogStash | 日志收集 | [https://github.com/logstash/logstash-logback-encoder](https://github.com/logstash/logstash-logback-encoder) + Lombok | 简化对象封装工具 | [https://github.com/rzwitserloot/lombok](https://github.com/rzwitserloot/lombok) + loc | 代码行数统计 | https://github.com/cgag/loc #### SpringBoot支持 https://spring.io/projects/spring-boot#support ### 命令打包,跳过TEST + ```shell script ./gradlew clean bootJar -x test ``` + ```shell ./gradlew dependencyInsight --dependency mybatis ``` + > 需要解决多工程的依赖分析 ### 多模块构建,依赖关系解决 + ```groovy // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上 // implementation project(':entity') /* 子模块之间的依赖 */ - compile project(':entity') /* 子模块之间的依赖 */ +compile project(':entity') /* 子模块之间的依赖 */ ``` 1. [如何使用Gradle管理多模块Java项目](https://zhuanlan.zhihu.com/p/372585663) @@ -95,14 +102,17 @@ https://spring.io/projects/spring-boot#support ### 版本指定,类似dependencyManager ### docker自动化跑起来 + google出品的一个插件,可以直接将SpringBoot构建推送到Docker仓库 + ```groovy id "com.google.cloud.tools.jib" version "2.0.0" ``` ## 统一Long类型序列化 -前端JS内置的number类型是基于32位整数,Number类型的最大安全整数为9007199254740991,当Java Long型的值大小超过JS Number的最大安全整数时,超出此范围的整数值可能会被破坏,丢失精度。 +前端JS内置的number类型是基于32位整数,Number类型的最大安全整数为9007199254740991,当Java Long型的值大小超过JS +Number的最大安全整数时,超出此范围的整数值可能会被破坏,丢失精度。 解决办法就是后端将超过精度的Long和long类型转成String给前端展示即可。 @@ -117,7 +127,9 @@ https://juejin.im/post/6844904196693557255 可能这种规范并不会被所有人认可,所以也可以用限制包的方式,自己配置指定包的枚举可以被统一处理。 #### Controller层 + ##### 入参 + ###### 表单提交 ![](./asset/img/枚举表单序列化.png) @@ -133,6 +145,7 @@ https://juejin.im/post/6844904196693557255 现在的问题在于jackson将枚举反序列化的时候需要使用code而不是ordinal。显然之前的Convert在这里貌似并没有什么作用。因为这里基本上全部靠jackson来序列化。 ##### 返回 + > 参考:[JSON类库Jackson优雅序列化Java枚举类 ](https://docs.qq.com/doc/DSFpuQkRrdk9xUlF6) @@ -141,6 +154,7 @@ https://juejin.im/post/6844904196693557255 如果发生无法正常解析的时候,那么可能是注入的bean无法使用 如果发现注入的bean无法解决json序列化问题,那么可以在`BaseEnum`加上这个注解 + ```java @JsonFormat(shape = JsonFormat.Shape.OBJECT) ``` @@ -152,6 +166,7 @@ https://juejin.im/post/6844904196693557255 1. [自动填充字段](https://docs.qq.com/doc/DSG5Zbk9RR1FHRVZE) #### 总结 + 通过上面方法,对数据库层和Controller层的转换操作,可以很好的处理枚举在应用中的形态,程序中可以很好的使用枚举了。 #### 自定义date的序列化器 @@ -160,13 +175,11 @@ https://blog.csdn.net/bandancer/article/details/84926383 [基于fastjson在mvc中解决enum类型序列化反序列化](https://zhuanlan.zhihu.com/p/121112597) - - ### 过滤器 [关于springboot中添加Filter的方法](https://www.jianshu.com/p/3d421fbce734) -### +### ``` WARN at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive (PoolBase.java:184) - HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@63ec6a5a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. @@ -185,9 +198,8 @@ https://blog.csdn.net/qq_27127145/article/details/85775240 > https://blog.csdn.net/u012954706/article/details/105437768 - - # TODO + - [ ] 有的前端输入带有空格或者换行,到数据库存储可能会发生意想不到的bug,所以需要在反序列化的时候,需要将其中的非法字符去掉 ### 构建 diff --git a/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java b/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java index 499b0f6..6f46db7 100644 --- a/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java +++ b/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java @@ -15,7 +15,7 @@ import java.sql.DriverManager; * @link https://blog.csdn.net/m0_37456570/article/details/83751401 */ @Slf4j -@Component +//@Component public class ApplicationStartupRunner implements CommandLineRunner { @Value("${spring.datasource.driver-class-name}") diff --git a/common/src/main/java/hxy/dream/common/init/MysqlDdl.java b/common/src/main/java/hxy/dream/common/init/MysqlDdl.java new file mode 100644 index 0000000..0201fd7 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/init/MysqlDdl.java @@ -0,0 +1,25 @@ +package hxy.dream.common.init; + +import com.baomidou.mybatisplus.extension.ddl.SimpleDdl; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; + +/** + * https://baomidou.com/pages/1812u1/ + * 数据库 DDL 表结构执行 SQL 自动维护功能 + */ +@Component +public class MysqlDdl extends SimpleDdl { + + /** + * 执行 SQL 脚本方式 + */ + @Override + public List getSqlFiles() { + return Arrays.asList( + "table.sql" + ); + } +} \ No newline at end of file -- Gitee From b433cb03b12140b165565bc098693441629e5dce Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Thu, 29 Dec 2022 10:42:45 +0800 Subject: [PATCH 009/204] =?UTF-8?q?mybatis-plus=E5=AE=98=E7=BD=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 483daa9..2d2a9bb 100644 --- a/README.md +++ b/README.md @@ -161,7 +161,8 @@ https://juejin.im/post/6844904196693557255 #### ORM层 -> 参考 mybatis-plus:https://mp.baomidou.com/guide/enum.html +> 参考 [mybatis-plus官网](https://baomidou.com/pages/8390a4/#%E6%AD%A5%E9%AA%A41-%E5%A3%B0%E6%98%8E%E9%80%9A%E7%94%A8%E6%9E%9A%E4%B8%BE%E5%B1%9E%E6%80%A7) + 1. [自动填充字段](https://docs.qq.com/doc/DSG5Zbk9RR1FHRVZE) -- Gitee From 1ffe0af6343bf981bc256885b47571329d373faf Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Thu, 29 Dec 2022 10:45:37 +0800 Subject: [PATCH 010/204] =?UTF-8?q?mybatis-plus=E5=AE=98=E7=BD=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/resources/application-beta.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/resources/application-beta.yml b/app/src/main/resources/application-beta.yml index f768fdb..ddff82f 100755 --- a/app/src/main/resources/application-beta.yml +++ b/app/src/main/resources/application-beta.yml @@ -5,7 +5,6 @@ spring: username: eric password: dream,1234.. driver-class-name: com.mysql.cj.jdbc.Driver - platform: mysql hikari: max-lifetime: 120000 # 池中连接关闭后的最长生命周期 20分钟 # type: com.alibaba.druid.pool.DruidDataSource @@ -17,6 +16,9 @@ spring: transport: dashboard: localhost:8080 #eager: true + sql: + init: + platform: mysql # redis: # database: 0 # host: 119.23.236.94 -- Gitee From 2b9786f0fb719102c78f64c7f0853299a752f5ea Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Thu, 29 Dec 2022 10:45:54 +0800 Subject: [PATCH 011/204] =?UTF-8?q?mybatis-plus=E5=AE=98=E7=BD=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 355d2ca..64e198c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ build/ /.scannerwork/ *.hprof **/build/ -**/out/ \ No newline at end of file +**/out/ +/app/src/main/resources/application-dev.yml -- Gitee From 5dd3e4ea08c1cde52bda100087f515f799bc1b12 Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Thu, 29 Dec 2022 10:47:51 +0800 Subject: [PATCH 012/204] yaml config --- app/src/main/resources/application-beta.yml | 10 ---- app/src/main/resources/application-test.yml | 63 +++++++++++++++++++++ app/src/main/resources/application.yml | 6 -- 3 files changed, 63 insertions(+), 16 deletions(-) create mode 100755 app/src/main/resources/application-test.yml diff --git a/app/src/main/resources/application-beta.yml b/app/src/main/resources/application-beta.yml index ddff82f..a710040 100755 --- a/app/src/main/resources/application-beta.yml +++ b/app/src/main/resources/application-beta.yml @@ -41,16 +41,6 @@ logging: hxy.dream: debug com.fasterxml.jackson: debug - -hxy: - print: - file: /home/ubuntu/eric/print/file - pay-status: true #支付测试 - single-price: 20 - double-price: 25 - shop: cupb - http: 8080 - https: 8443 #server: # ssl: # key-store: classpath:cupbtop.jks diff --git a/app/src/main/resources/application-test.yml b/app/src/main/resources/application-test.yml new file mode 100755 index 0000000..bd590e2 --- /dev/null +++ b/app/src/main/resources/application-test.yml @@ -0,0 +1,63 @@ +#线上测试配置 +spring: + datasource: + url: jdbc:p6spy:mysql://mysql.cupb.top:3306/eric?useUnicode=true&serverTimezone=GMT%2b8&characterEncoding=UTF-8 + username: eric + password: dream,1234.. +# driver-class-name: com.mysql.cj.jdbc.Driver + driver-class-name: com.p6spy.engine.spy.P6SpyDriver + hikari: + max-lifetime: 120000 # 池中连接关闭后的最长生命周期 20分钟 + # type: com.alibaba.druid.pool.DruidDataSource + servlet: + multipart: + enabled: false + cloud: + sentinel: + transport: + dashboard: localhost:8080 + #eager: true + sql: + init: + platform: mysql +# redis: +# database: 0 +# host: 119.23.236.94 +# port: 6379 +# password: newpass +# jedis: +# pool: +# max-active: 8 +# cache: +# redis: +# time-to-live: 0s # 缓存过期时间30分钟 +# type: redis +# rabbitmq: +# host: 119.23.236.94 + +logging: + level: + root: info #其他的包都是使用info正常显示日志 + hxy.dream.dao: trace # 显示mybatis的操作时候所有级别的日志 + hxy.dream: debug + com.fasterxml.jackson: debug + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +hxy: + print: + file: /home/ubuntu/eric/print/file + pay-status: true #支付测试 + single-price: 20 + double-price: 25 + shop: cupb + http: 8080 + https: 8443 +#server: +# ssl: +# key-store: classpath:cupbtop.jks +# key-store-password: Sigh,0404 +# key-store-type: JKS #RSA +# port: 8443 \ No newline at end of file diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index a0d0b59..807d220 100755 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -38,12 +38,6 @@ mybatis-plus: id-type: auto type-enums-package: hxy.dream.entity.enums -# pagehelper分页插件 -pagehelper: - # 数据库的方言 - helperDialect: mysql - # 启用合理化,如果pageNum < 1会查询第一页,如果pageNum > pages会查询最后一页 - reasonable: true server: port: 8080 # tomcat: -- Gitee From 6dbc3291847ea00eeac326d8cfa2240d0e325ab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 31 Dec 2022 19:42:15 +0800 Subject: [PATCH 013/204] bump springboot and myabtis-plus --- build.gradle | 2 +- entity/build.gradle | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 79dfad9..438ccb1 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.0.0' + springBootVersion = '3.0.1' } repositories { mavenLocal() diff --git a/entity/build.gradle b/entity/build.gradle index 3d67b0e..f3ba6bc 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,8 +8,8 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-boot-starter:3.5.2.7-SNAPSHOT' - api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0-SNAPSHOT' + api 'com.baomidou:mybatis-plus-boot-starter:3.5.3' + api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0' api 'org.springframework.boot:spring-boot-starter-validation' -- Gitee From 12f92752095a47dab531f3374e542a730273a31c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 6 Jan 2023 20:47:50 +0800 Subject: [PATCH 014/204] =?UTF-8?q?json=20=E6=97=B6=E5=8C=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/hxy/dream/common/configuration/BeanConfig.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java index cbd6e44..5d1fbb4 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java @@ -27,6 +27,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.util.Date; +import java.util.TimeZone; @Slf4j @Configuration @@ -48,6 +49,7 @@ public class BeanConfig { simpleModule.addSerializer(Long.class, new BaseLongSerializer()); simpleModule.addSerializer(Long.TYPE, new BaseLongSerializer()); + builder.timeZone(TimeZone.getDefault()); ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.registerModule(simpleModule); -- Gitee From 7aceffb6f38ebf388c58b0d38cdb5308f1501edc Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Sat, 7 Jan 2023 12:06:38 +0800 Subject: [PATCH 015/204] =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2d2a9bb..9d4493e 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ Eric-Dream 里面落地到生产。 本项目是基于Gradle构建的多模块SpringCloud工程。采用`传统线程模型` -的SpringWeb框架,mybatis-plus和mysql官方驱动。非常适合入门者学习。本项目的一大亮点就是自定义枚举序列化的处理。 +的SpringWeb框架,mybatis-plus和mysql官方驱动。非常适合入门者学习。本项目的一大亮点就是[自定义枚举序列化的处理](SERIALIZE.md)。 ## 主要实现功能如下 -- Gitee From 6262f1ec5306815633e8f0bd493a83b5742c1487 Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Sat, 7 Jan 2023 12:07:31 +0800 Subject: [PATCH 016/204] =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9d4493e..9fe9698 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Eric-Dream 功能 | 实现 | 用途 -----------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------|-------------- - jackson序列化 | 自定义序列化器 | 解决参数枚举的序列化问题 + [jackson序列化](SERIALIZE.md) | 自定义序列化器 | 解决参数枚举的序列化问题 logback钉钉通知 | 自定义Appender | Error消息及时通知 logback邮件通知 | 默认支持 | Error异常及时通知 全局异常捕获 | 默认支持 | 捕获异常 -- Gitee From f0ff2e27b43c035f443d9d6c992bb731a9afcfb6 Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Sat, 7 Jan 2023 12:17:56 +0800 Subject: [PATCH 017/204] =?UTF-8?q?=E6=9B=B4=E6=96=B0gradle=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 24 +++++++++++++++++++----- asset/img/gradle-wrapper.png | Bin 79479 -> 194900 bytes 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9fe9698..1f15bb9 100644 --- a/README.md +++ b/README.md @@ -15,12 +15,22 @@ Eric-Dream logback邮件通知 | 默认支持 | Error异常及时通知 全局异常捕获 | 默认支持 | 捕获异常 数据库字段加解密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 给部分数据库字段加解密 - 执行SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | + 执行初始化SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | [MybatisPlus的SQL脚本自动维护](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) | https://baomidou.com/pages/1812u1/ | 自动建表 SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | 具体框架如下表: +### 执行初始化的sql语句 +有两种方案。一种借助与mybatis-plus 另一种就是mybatis的 +#### 基于mybatis的sql执行方案 + +[hxy.dream.common.init.ApplicationStartupRunner](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) + +#### 基于mybatis-plus的sql执行方案 + +[hxy.dream.common.init.MysqlDdl](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) + ### OpenFeign要退出历史舞台了 推荐 RestTemplate或者WebClient @@ -44,11 +54,11 @@ eric-dream ## gradle安装与配置 -https://hub.fastgit.org/GradleCN/GradleSide +https://github.com/GradleCN/GradleSide 如果IDEA自动下载gradle很慢。那么可以先提前安装好gradle,然后指定下安装目录即可。 ![](./asset/img/gradle-special-location.png) -![](./asset/img/gradle-wrapper.png) +![img.png](asset/img/gradle-wrapper.png) 技术 | 说明 | 官网 ----------------------|--------------------|-------------------------------------------------------------------------------------------------------------- @@ -89,8 +99,12 @@ https://spring.io/projects/spring-boot#support > 需要解决多工程的依赖分析 -### 多模块构建,依赖关系解决 +### gradle多模块构建,依赖关系解决 +```groovy + api project(':dao') +``` +以下是 gradle6前后的使用方式: ```groovy // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上 // implementation project(':entity') /* 子模块之间的依赖 */ @@ -201,7 +215,7 @@ https://blog.csdn.net/qq_27127145/article/details/85775240 # TODO -- [ ] 有的前端输入带有空格或者换行,到数据库存储可能会发生意想不到的bug,所以需要在反序列化的时候,需要将其中的非法字符去掉 +- [ ] 有的前端输入带有空格或者换行,到数据库存储可能会发生意想不到的bug,所以需要在反序列化的时候,需要将其中的非法字符去掉。需要设计一个方案做下全局的参数trim() ### 构建 diff --git a/asset/img/gradle-wrapper.png b/asset/img/gradle-wrapper.png index 8f2c0fe7c7b9114e55dca5ab048cc7b1770e983f..e8e51131efd03b7e28d7d61553a8a85f37f91141 100644 GIT binary patch literal 194900 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 literal 79479 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 Date: Sat, 7 Jan 2023 23:01:11 +0800 Subject: [PATCH 018/204] =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E7=A9=BA=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/service/impl/UserServiceImpl.java | 2 +- build.gradle | 2 +- .../common/configuration/AsyncConfig.java | 11 +- .../common/configuration/BeanConfig.java | 4 + .../configuration/FilterConfiguration.java | 38 ++++++ .../common/filter/RequestTrimFilter.java | 23 ++++ .../RequestTrimHttpServletRequestWrapper.java | 129 ++++++++++++++++++ .../serializer/StringTrimDeserializer.java | 36 +++++ .../hxy/dream/common/util/SpringUtils.java | 129 ++++++++++++++++++ .../java/hxy/dream/common/util/ValueUtil.java | 24 ++++ 10 files changed, 386 insertions(+), 12 deletions(-) create mode 100644 common/src/main/java/hxy/dream/common/configuration/FilterConfiguration.java create mode 100644 common/src/main/java/hxy/dream/common/filter/RequestTrimFilter.java create mode 100644 common/src/main/java/hxy/dream/common/filter/wrapper/RequestTrimHttpServletRequestWrapper.java create mode 100644 common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java create mode 100644 common/src/main/java/hxy/dream/common/util/SpringUtils.java create mode 100644 common/src/main/java/hxy/dream/common/util/ValueUtil.java diff --git a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java index 9777b9c..7528f64 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java @@ -30,7 +30,7 @@ public class UserServiceImpl implements UserService { GenderEnum gender = userParam.getGender(); userModel.setGender(gender); userModel.setAddress(userParam.getAddress()); - userModel.setAge(userModel.getAge()); + userModel.setAge(userParam.getAge()); if (gender == GenderEnum.UNKNOWN) { log.error("性别未知"); } diff --git a/build.gradle b/build.gradle index 438ccb1..6aa0eb5 100644 --- a/build.gradle +++ b/build.gradle @@ -128,13 +128,13 @@ subprojects { implementation 'com.zaxxer:HikariCP:5.0.1' implementation 'p6spy:p6spy:3.9.1' implementation 'org.springframework.boot:spring-boot-starter-webflux' + implementation 'commons-io:commons-io:2.11.0' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' testImplementation 'io.projectreactor:reactor-test' - // https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-sentinel // compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-alibaba-sentinel', version: '0.9.0.RELEASE' diff --git a/common/src/main/java/hxy/dream/common/configuration/AsyncConfig.java b/common/src/main/java/hxy/dream/common/configuration/AsyncConfig.java index 8c927fd..6a43f72 100644 --- a/common/src/main/java/hxy/dream/common/configuration/AsyncConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/AsyncConfig.java @@ -46,14 +46,5 @@ public class AsyncConfig { // } // return registration; // } - @Bean - public FilterRegistrationBean someFilterRegistration() { - FilterRegistrationBean registration = new FilterRegistrationBean(); - registration.setFilter(new TokenFilter()); - registration.addUrlPatterns("/*"); - registration.setAsyncSupported(true); - registration.setName("repeatableFilter"); - registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); - return registration; - } + } diff --git a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java index 5d1fbb4..0a3568d 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java @@ -20,6 +20,7 @@ import hxy.dream.common.serializer.BaseLongSerializer; import hxy.dream.common.serializer.DateJsonDeserializer; import hxy.dream.common.serializer.DateJsonSerializer; import hxy.dream.common.serializer.SimpleDeserializersWrapper; +import hxy.dream.common.serializer.StringTrimDeserializer; import hxy.dream.entity.enums.BaseEnum; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; @@ -33,6 +34,7 @@ import java.util.TimeZone; @Configuration public class BeanConfig { + @Bean public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { SimpleModule simpleModule = new SimpleModule(); @@ -49,6 +51,8 @@ public class BeanConfig { simpleModule.addSerializer(Long.class, new BaseLongSerializer()); simpleModule.addSerializer(Long.TYPE, new BaseLongSerializer()); + simpleModule.addDeserializer(String.class, new StringTrimDeserializer(String.class)); + builder.timeZone(TimeZone.getDefault()); ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.registerModule(simpleModule); diff --git a/common/src/main/java/hxy/dream/common/configuration/FilterConfiguration.java b/common/src/main/java/hxy/dream/common/configuration/FilterConfiguration.java new file mode 100644 index 0000000..11b3622 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/configuration/FilterConfiguration.java @@ -0,0 +1,38 @@ +package hxy.dream.common.configuration; + +import hxy.dream.common.filter.RequestTrimFilter; +import hxy.dream.common.filter.TokenFilter; +import jakarta.servlet.DispatcherType; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class FilterConfiguration { + @Bean + public FilterRegistrationBean someFilterRegistration() { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setFilter(new TokenFilter()); + registration.addUrlPatterns("/*"); + registration.setAsyncSupported(true); + registration.setName("repeatableFilter"); + registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); + return registration; + } + + /** + * 添加去除参数头尾空格过滤器 + * + * @return + */ + @Bean + public FilterRegistrationBean trimFilter() { + FilterRegistrationBean registration = new FilterRegistrationBean(); + registration.setDispatcherTypes(DispatcherType.REQUEST); + registration.setFilter(new RequestTrimFilter()); + registration.addUrlPatterns("/*"); + registration.setName("RequestTrimFilter"); + registration.setOrder(Integer.MAX_VALUE - 1); + return registration; + } +} diff --git a/common/src/main/java/hxy/dream/common/filter/RequestTrimFilter.java b/common/src/main/java/hxy/dream/common/filter/RequestTrimFilter.java new file mode 100644 index 0000000..656998d --- /dev/null +++ b/common/src/main/java/hxy/dream/common/filter/RequestTrimFilter.java @@ -0,0 +1,23 @@ +package hxy.dream.common.filter; + +import hxy.dream.common.filter.wrapper.RequestTrimHttpServletRequestWrapper; +import jakarta.servlet.Filter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; +import java.io.IOException; + +/** + * 请求参数过滤器 + */ +public class RequestTrimFilter implements Filter { + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + filterChain.doFilter(new RequestTrimHttpServletRequestWrapper((HttpServletRequest) servletRequest), servletResponse); + } + +} diff --git a/common/src/main/java/hxy/dream/common/filter/wrapper/RequestTrimHttpServletRequestWrapper.java b/common/src/main/java/hxy/dream/common/filter/wrapper/RequestTrimHttpServletRequestWrapper.java new file mode 100644 index 0000000..916dda5 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/filter/wrapper/RequestTrimHttpServletRequestWrapper.java @@ -0,0 +1,129 @@ +package hxy.dream.common.filter.wrapper; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import hxy.dream.common.util.SpringUtils; +import org.apache.commons.io.IOUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.util.StringUtils; + +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +/** + * 请求参数trim处理,非json参数 + */ +public class RequestTrimHttpServletRequestWrapper extends HttpServletRequestWrapper { + + private static final String CHARSET = "utf-8"; + + private Map params = new HashMap<>(); + + + public RequestTrimHttpServletRequestWrapper(HttpServletRequest request) { + //将request交给父类,调用对应方法的时候,将其输出 + super(request); + //持有request中的参数 + this.params.putAll(request.getParameterMap()); + this.modifyParameterValues(); + } + +// /** 这里对json的处理是多余的,jackson在全局反序列化的时候已经处理了 +// * post类型的请求参数必须通过流才能获取到值 +// */ +// @Override +// public ServletInputStream getInputStream() throws IOException { +// //非json类型,直接返回 +// if (!MediaType.APPLICATION_JSON_VALUE.equalsIgnoreCase(super.getHeader(HttpHeaders.CONTENT_TYPE))) { +// return super.getInputStream(); +// } +// //为空,直接返回 +// String json = IOUtils.toString(super.getInputStream(), CHARSET); +// if (!StringUtils.hasLength(json)) { +// return super.getInputStream(); +// } +// +// // FIXME 这里对json的 trim是多余的。 +// ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class); +// JsonNode jsonObject = objectMapper.readTree(json); +// byte[] bytes = objectMapper.writeValueAsString(jsonObject).getBytes(CHARSET); +// +// ByteArrayInputStream bis = new ByteArrayInputStream(bytes); +// return new MyServletInputStream(bis); +// } + + /** + * 将parameter的值去除空格后重写回去 + */ + public void modifyParameterValues() { + Set set = params.keySet(); + Iterator it = set.iterator(); + while (it.hasNext()) { + String key = it.next(); + String[] values = params.get(key); + if (values != null && values.length > 0) { + for (int i = 0; i < values.length; i++) { + values[i] = values[i].trim(); + } + } + params.put(key, values); + } + } + + /** + * 从当前类中map获取参数 + */ + @Override + public String getParameter(String name) { + String[] values = params.get(name); + if (values == null || values.length == 0) { + return null; + } + return values[0]; + } + + @Override + public String[] getParameterValues(String name) { + return params.get(name); + } + + @Deprecated + class MyServletInputStream extends ServletInputStream { + private ByteArrayInputStream bis; + + public MyServletInputStream(ByteArrayInputStream bis) { + this.bis = bis; + } + + @Override + public boolean isFinished() { + return true; + } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setReadListener(ReadListener listener) { + + } + + @Override + public int read() { + return bis.read(); + } + } + +} diff --git a/common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java b/common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java new file mode 100644 index 0000000..4595257 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java @@ -0,0 +1,36 @@ +package hxy.dream.common.serializer; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.deser.std.StdScalarDeserializer; + +import java.io.IOException; + +/** + * jackson全局去掉 前后空格,特别是接受前端参数 + */ +public class StringTrimDeserializer extends StdScalarDeserializer { + + /** + * 子类可以重写父类中的protected方法,并把它的可见性改为public,但是子类不能削弱父类中定义的方法的可访问性。 + * 例如:如果一个方法在父类中被定义为public,在子类中也必须为public。子类方法的可访问性必须大于等于父类方法的可访问性。 + * + * @param vc + */ + public StringTrimDeserializer(Class vc) { + super(vc); + } + + @Override + public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException { + + String valueAsString = p.getValueAsString(); + + if (valueAsString != null) { + valueAsString = valueAsString.trim(); + } + + return valueAsString; + } +} diff --git a/common/src/main/java/hxy/dream/common/util/SpringUtils.java b/common/src/main/java/hxy/dream/common/util/SpringUtils.java new file mode 100644 index 0000000..04977af --- /dev/null +++ b/common/src/main/java/hxy/dream/common/util/SpringUtils.java @@ -0,0 +1,129 @@ +package hxy.dream.common.util; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * spring工具类 方便在非spring管理环境中获取bean + * + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware { + /** + * Spring应用上下文环境 + */ + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringUtils.applicationContext = applicationContext; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws BeansException + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws BeansException + */ + public static T getBean(Class clz) throws BeansException { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws NoSuchBeanDefinitionException + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws NoSuchBeanDefinitionException + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws NoSuchBeanDefinitionException + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) { + return (T) AopContext.currentProxy(); + } + + /** + * 获取当前的环境配置,无配置返回null + * + * @return 当前的环境配置 + */ + public static String[] getActiveProfiles() { + return applicationContext.getEnvironment().getActiveProfiles(); + } + + /** + * 获取当前的环境配置,当有多个环境配置时,只获取第一个 + * + * @return 当前的环境配置 + */ + public static String getActiveProfile() { + final String[] activeProfiles = getActiveProfiles(); + return activeProfiles != null && activeProfiles.length > 0 ? activeProfiles[0] : null; + } +} diff --git a/common/src/main/java/hxy/dream/common/util/ValueUtil.java b/common/src/main/java/hxy/dream/common/util/ValueUtil.java new file mode 100644 index 0000000..5e40c37 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/util/ValueUtil.java @@ -0,0 +1,24 @@ +package hxy.dream.common.util; + + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +@Component +public class ValueUtil { + + private static String value; + + /** + * @return 为Spring容器外的方法提供SpringBoot的配置文件信息 + */ + public static String getValue() { + return value; + } + + @Value("${server.port}") + public void setValue(String value) { + ValueUtil.value = value; + } + +} -- Gitee From bdb116f5fb9925556d29679e932638252b1c105f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 7 Jan 2023 23:05:21 +0800 Subject: [PATCH 019/204] =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E7=A9=BA=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/resources/logback-spring.xml | 3 +- .../CustomLogContextListener.java | 87 +++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/hxy/dream/common/configuration/CustomLogContextListener.java diff --git a/app/src/main/resources/logback-spring.xml b/app/src/main/resources/logback-spring.xml index 25e2757..92914dc 100644 --- a/app/src/main/resources/logback-spring.xml +++ b/app/src/main/resources/logback-spring.xml @@ -10,7 +10,8 @@ - + + diff --git a/common/src/main/java/hxy/dream/common/configuration/CustomLogContextListener.java b/common/src/main/java/hxy/dream/common/configuration/CustomLogContextListener.java new file mode 100644 index 0000000..a894f84 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/configuration/CustomLogContextListener.java @@ -0,0 +1,87 @@ +package hxy.dream.common.configuration; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.LoggerContextListener; +import ch.qos.logback.core.Context; +import ch.qos.logback.core.spi.ContextAwareBase; +import ch.qos.logback.core.spi.LifeCycle; +import org.springframework.util.ResourceUtils; + +import java.io.File; +import java.io.FileNotFoundException; + +/** + * @version 1.0 + * @class: CustomLogContextListener + * @description: 定义logback 日志监听器,指定日志文件存放目录 主要是解决远程脚本部署的时候发现,日志./logs会新建在用户目录下,而不是应用部署的目录下 + */ +public class CustomLogContextListener extends ContextAwareBase implements LoggerContextListener, LifeCycle { + + /** + * 存储日志路径标识 + */ + private static final String LOG_PAHT_KEY = "LOG_PATH"; + + @Override + public boolean isResetResistant() { + return false; + } + + @Override + public void onStart(LoggerContext loggerContext) { + + } + + @Override + public void onReset(LoggerContext loggerContext) { + + } + + @Override + public void onStop(LoggerContext loggerContext) { + + } + + @Override + public void onLevelChange(Logger logger, Level level) { + + } + + @Override + public void start() { + String classpath = null; + try { + classpath = ResourceUtils.getURL(ResourceUtils.CLASSPATH_URL_PREFIX).getPath(); + } catch (FileNotFoundException e) { + System.err.println("File not found" + e.getMessage()); + } + + String logPath = "./logs"; + + // 判断是否jar 包启动 + if (classpath != null && classpath.contains("jar!")) { + System.out.println("classpath:" + classpath); + String currentPath = new File(classpath).getParentFile().getParentFile().getParent(); + // 如果是jar包启动的,那么获取当前jar包程序的路径,作为日志存放的位置 + currentPath = currentPath.replace("file:", ""); + logPath = currentPath + File.separator + "logs"; + } + + System.out.println("日志存储路径 " + logPath); + System.setProperty(LOG_PAHT_KEY, logPath); + Context context = getContext(); + context.putProperty(LOG_PAHT_KEY, logPath); + } + + @Override + public void stop() { + + } + + @Override + public boolean isStarted() { + return false; + } +} -- Gitee From 82c0fd000bc21bd6baddb5647d4f717fff045049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 7 Jan 2023 23:58:40 +0800 Subject: [PATCH 020/204] =?UTF-8?q?=E5=8F=82=E6=95=B0=E5=8E=BB=E6=8E=89?= =?UTF-8?q?=E7=A9=BA=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1f15bb9..46b3646 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,8 @@ Eric-Dream 执行初始化SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | [MybatisPlus的SQL脚本自动维护](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) | https://baomidou.com/pages/1812u1/ | 自动建表 SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | +参数全局trim() | [StringTrimDeserializer](common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java) | 避免异常数据 +Long类型超长转String | | 解决前端无法正确显示超长String 具体框架如下表: @@ -215,7 +217,7 @@ https://blog.csdn.net/qq_27127145/article/details/85775240 # TODO -- [ ] 有的前端输入带有空格或者换行,到数据库存储可能会发生意想不到的bug,所以需要在反序列化的时候,需要将其中的非法字符去掉。需要设计一个方案做下全局的参数trim() +- [x] 有的前端输入带有空格或者换行,到数据库存储可能会发生意想不到的bug,所以需要在反序列化的时候,需要将其中的非法字符去掉。需要设计一个方案做下全局的参数trim() ### 构建 -- Gitee From 88832fd8b80c3890651d63371f1bfdd99f3d5747 Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Sun, 8 Jan 2023 10:36:12 +0800 Subject: [PATCH 021/204] =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E5=80=BCtrim?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../serializer/BaseEnumDeserializer.java | 6 ++- .../serializer/DefaultInputJsonToEnum.java | 39 ++++++++++--------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/serializer/BaseEnumDeserializer.java b/common/src/main/java/hxy/dream/common/serializer/BaseEnumDeserializer.java index f5d6e5d..bcea3ad 100644 --- a/common/src/main/java/hxy/dream/common/serializer/BaseEnumDeserializer.java +++ b/common/src/main/java/hxy/dream/common/serializer/BaseEnumDeserializer.java @@ -84,7 +84,11 @@ public class BaseEnumDeserializer extends JsonDeserializer { Class enumClass = field.getType(); BaseEnum anEnum = DefaultInputJsonToEnum.getEnum(inputParameter, enumClass); - log.debug("\n====>测试反序列化枚举[{}]==>[{}.{}]", inputParameter, anEnum.getClass(), anEnum); + if (anEnum != null) { + if (log.isDebugEnabled()) { + log.debug("\n====>测试反序列化枚举[{}]==>[{}.{}]", inputParameter, anEnum.getClass(), anEnum); + } + } return anEnum; } else { throw new BaseException("自定义枚举反序列化错误:json的这个字段[" + parsingContext.getParent() + "]没有值。枚举反序列化失败,注意该属性不可以使用lombok的注解,如@NonNull等"); diff --git a/common/src/main/java/hxy/dream/common/serializer/DefaultInputJsonToEnum.java b/common/src/main/java/hxy/dream/common/serializer/DefaultInputJsonToEnum.java index 217961d..fb6619f 100644 --- a/common/src/main/java/hxy/dream/common/serializer/DefaultInputJsonToEnum.java +++ b/common/src/main/java/hxy/dream/common/serializer/DefaultInputJsonToEnum.java @@ -18,29 +18,32 @@ public class DefaultInputJsonToEnum { if (debugEnabled) { logger.debug("\n====>反序列化,当前输入的值[{}]对应的枚举类是[{}]", inputParameter, enumClass); } - try { + if (inputParameter != null && inputParameter.length() > 0) { + inputParameter = inputParameter.trim(); + try { // values是默认的方法,必定存在 - Method valuesMethod = enumClass.getDeclaredMethod("values"); + Method valuesMethod = enumClass.getDeclaredMethod("values"); // 通过反射获取该枚举类的所有枚举值 - BaseEnum[] values = (BaseEnum[]) valuesMethod.invoke(null); - BaseEnum baseEnum = null; - - for (BaseEnum value : values) { - //因为inputParameter都是string类型的,code转成字符串才能比较 - if (inputParameter.equals(String.valueOf(value.code())) || inputParameter.equals(value.description())) { - baseEnum = value; - break; + BaseEnum[] values = (BaseEnum[]) valuesMethod.invoke(null); + BaseEnum baseEnum = null; + + for (BaseEnum value : values) { + //因为inputParameter都是string类型的,code转成字符串才能比较 + if (inputParameter.equals(String.valueOf(value.code())) || inputParameter.equals(value.description())) { + baseEnum = value; + break; + } } + //如果都拿不到,那就直接抛出异常了 + if (baseEnum == null) { + throw new RuntimeException(String.format("枚举反序列化错误,输入参数[%s]找不到对应的枚举值", inputParameter)); + } + return baseEnum; + } catch (Exception e) { + throw new RuntimeException(e); } - - //如果都拿不到,那就直接抛出异常了 - if (baseEnum == null) { - throw new RuntimeException(String.format("枚举反序列化错误,输入参数[%s]找不到对应的枚举值", inputParameter)); - } - return baseEnum; - } catch (Exception e) { - throw new RuntimeException(e); } + return null; } private BaseEnum getEnumByName(String inputParameter, Class enumClass) { -- Gitee From b83d0acd561d4ed1670a206db28db5f4b3f38be9 Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Sun, 8 Jan 2023 15:36:33 +0800 Subject: [PATCH 022/204] =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96debug?= =?UTF-8?q?=E7=BA=A7=E5=88=AB=E6=97=A5=E5=BF=97=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/hxy/dream/common/serializer/BaseEnumSerializer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/hxy/dream/common/serializer/BaseEnumSerializer.java b/common/src/main/java/hxy/dream/common/serializer/BaseEnumSerializer.java index 724b22f..add715d 100644 --- a/common/src/main/java/hxy/dream/common/serializer/BaseEnumSerializer.java +++ b/common/src/main/java/hxy/dream/common/serializer/BaseEnumSerializer.java @@ -14,7 +14,9 @@ public class BaseEnumSerializer extends JsonSerializer { @Override public void serialize(BaseEnum value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException { - log.info("\n====>开始序列化[{}]", value); + if (log.isDebugEnabled()) { + log.debug("\n====>开始序列化[{}]", value); + } if (value != null) { gen.writeStartObject(); Integer code = value.code(); -- Gitee From dba50004a25e8abfd4842f95a203f5346a518d1a Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Sun, 8 Jan 2023 16:28:43 +0800 Subject: [PATCH 023/204] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SERIALIZE.md | 413 ++++++++++-------- .../common/serializer/DateJsonSerializer.java | 24 +- img.png | Bin 0 -> 20553 bytes 3 files changed, 245 insertions(+), 192 deletions(-) create mode 100644 img.png diff --git a/SERIALIZE.md b/SERIALIZE.md index c96ad61..2a9e575 100644 --- a/SERIALIZE.md +++ b/SERIALIZE.md @@ -1,6 +1,8 @@ # SpringBoot+Mybatisplus中枚举正反序列化的实际应用 -> 本文基于SpringBoot+Mybatisplus 框架就Java枚举的正反序列化的实际应用进行一次分析与研究,此外顺便带上DAO层关于枚举的操作,使得程序中完全使用枚举编程。由于SpringBoot内置的json处理器是jackson,所以本文的json相关处理也就是采用默认的jackson。 +> 本文基于SpringBoot+Mybatisplus +> +框架就Java枚举的正反序列化的实际应用进行一次分析与研究,此外顺便带上DAO层关于枚举的操作,使得程序中完全使用枚举编程。由于SpringBoot内置的json处理器是jackson,所以本文的json相关处理也就是采用默认的jackson。 ## 本文解决的痛点 @@ -25,25 +27,22 @@ N久之前,leo曾经问我枚举的应用,我清楚地记得菜鸟教程(htt ![](./asset/img/emum-respone.png) - 无论枚举要怎么使用,我还是按照自己的相关需求来实践了一把,由于项目中有很多枚举,使用和管理起来非常晕乎乎的。 需要把枚举与Integer转来转去,前端传输过来了一个Integer,需要手动将Integer转成枚举,存储到数据库的时候,又得将枚举转成Integer保存。 如果纯粹使用Integer传值,编码又不能知道这个数字代表啥意思,最后找来找去,注释也不全。不光是后端很是晕乎乎的。 前端由于也只接受了Integer,需要显示文字的时候,只能前后端共同定,一旦后端修改了枚举,那么前端则必须同步修改。 为了解决这个问题,我在网上找了一些解决办法,但是都不尽人意。最后折腾了jackson源码并求助于jackson的维护者解决了枚举正反序列化的问题。 - ## 基础框架 - 框架 | 官网 | 版本 - --- | --- | --- - SpringBoot| https://spring.io/projects/spring-boot | V2.2.9-GA - SpringWebMVC| https://spring.io/projects/spring-framework | 5.2.8.REALEASE - Mybatis-plus | https://mybatis.plus/ | 3.4.0 - jackson | https://github.com/FasterXML/jackson | 2.10.5 - - > 上面的框架的各个版本可能代码有点差别,但是基本思想都是一样的,所以版本不会有很大影响。此外其他计算机语言或者框架实现本文的思想都是可以的。 + 框架 | 官网 | 版本 +--------------|---------------------------------------------|---------------- + SpringBoot | https://spring.io/projects/spring-boot | V2.2.9-GA + SpringWebMVC | https://spring.io/projects/spring-framework | 5.2.8.REALEASE + Mybatis-plus | https://mybatis.plus/ | 3.4.0 + jackson | https://github.com/FasterXML/jackson | 2.10.5 +> 上面的框架的各个版本可能代码有点差别,但是基本思想都是一样的,所以版本不会有很大影响。此外其他计算机语言或者框架实现本文的思想都是可以的。 ## 模型介绍 @@ -51,8 +50,10 @@ N久之前,leo曾经问我枚举的应用,我清楚地记得菜鸟教程(htt ![](./asset/img/structure.png) -本文的重点是枚举的正反序列化,但是为了让整个枚举在工程中的应用比较完整,也会描述下枚举在DAO层的操作。jackson的正反序列化主要应用在Controller层的`参数接收`与`结果返回`。在参数接收的时候有两种形式,一种的前端通过表单提交的数据,另一种是从body提交的json数据,两种有很大的区别,在Controller的方法里面主要体现在body提交的json数据需要在对象前面加上`@RequestBody`.当然两者本质上有点区别,由于表单提交的不是json,所以无法采用json反序列化,但是本文中会顺带描述到表单提交的数据如何转换成枚举。 - +本文的重点是枚举的正反序列化,但是为了让整个枚举在工程中的应用比较完整,也会描述下枚举在DAO层的操作。jackson的正反序列化主要应用在Controller层的`参数接收` +与`结果返回` +。在参数接收的时候有两种形式,一种的前端通过表单提交的数据,另一种是从body提交的json数据,两种有很大的区别,在Controller的方法里面主要体现在body提交的json数据需要在对象前面加上`@RequestBody` +.当然两者本质上有点区别,由于表单提交的不是json,所以无法采用json反序列化,但是本文中会顺带描述到表单提交的数据如何转换成枚举。 ## show you code @@ -65,9 +66,9 @@ https://gitee.com/eric-tutorial/SpringCloud-multiple-gradle ### 定义枚举 ```java -public enum GenderEnum { - - BOY(100, "男"), GIRL(200, "女"),UNKNOWN(0, "未知"); +public enum GenderEnum { + + BOY(100, "男"), GIRL(200, "女"), UNKNOWN(0, "未知"); private final Integer code; @@ -77,41 +78,46 @@ public enum GenderEnum { this.code = code; this.description = description; } - + } ``` + ### 接受参数的对象 ```java + @Data public class UserParam { - + @NotBlank(message = "name不能为空") String name; - + @NotNull(message = "gender为1或者2") GenderEnum gender; - + @NotNull(message = "age不能为空") Integer age; - + } ``` + 注意参数Field的上面校验注解不可以是lombok的,否则会改变字节码信息,导致类的Field与值无法识别,最后枚举反序列化失败 ### Controller POST方法 + ```java @PostMapping("add/body") - public BaseResponseVO saveBody(@Valid @RequestBody UserParam userParam) { - UserModel userModel = userService.add(userParam); +public BaseResponseVO saveBody(@Valid @RequestBody UserParam userParam){ + UserModel userModel=userService.add(userParam); return BaseResponseVO.success(userModel); - } + } ``` 上面代码可以看出来框架在接受参数的时候将网络传输过来的数据进行了反序列化,在返回给前端的时候进行了正序列化成json返回的。 默认的jackson是无法直接按照`GenderEnum`中的`code`来正反序列化枚举的,因为jackson有一套自己的枚举序列化机制,从源代码中看出来, -它是按照`java.lang.Enum.class`的`name`和`ordinal`来正反序列化的。但是这个不能满足我自己定义的`code`和`description`来正反序列化的需求。 +它是按照`java.lang.Enum.class`的`name`和`ordinal`来正反序列化的。但是这个不能满足我自己定义的`code`和`description` +来正反序列化的需求。 因此我在网上搜了下,看看有木有人完成这样的需求,我想这个需求应该比较正常,网上一搜果然有很多,但是能实现的却没几个。 于是经过自己折腾,很快就有了下面的代码(最后发现都是采用默认的jackson枚举正反序列化器,并不满足需求,需要自己重写序列化器)。 @@ -141,29 +147,34 @@ public interface BaseEnum { ``` #### 正序列化器 + ```java + @Slf4j public class BaseEnumSerializer extends JsonSerializer { @Override public void serialize(BaseEnum value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException { - + log.info("\n====>开始序列化[{}]", value); gen.writeStartObject(); gen.writeNumberField("code", value.code()); gen.writeStringField("description", value.description()); gen.writeEndObject(); - + } } ``` -效果就是既返回`code`和`description`,前端既知道`code`也知道`description`.`description`可以直接显示,`code`可以用来返回给后端的操作.前端再也不用同步修改`description`了,也不需要自己判断`code`是啥意思,直接显示`description`即可.皆大欢喜. +效果就是既返回`code`和`description`,前端既知道`code`也知道`description`.`description`可以直接显示,`code` +可以用来返回给后端的操作.前端再也不用同步修改`description`了,也不需要自己判断`code`是啥意思,直接显示`description` +即可.皆大欢喜. #### 反序列化器 ```java + @Slf4j public class BaseEnumDeserializer extends JsonDeserializer { @Override @@ -179,10 +190,10 @@ public class BaseEnumDeserializer extends JsonDeserializer { JsonStreamContext parsingContext = p.getParsingContext(); String currentName = parsingContext.getCurrentName();//字段名 Object currentValue = parsingContext.getCurrentValue();//前端注入的对象(ResDTO) - Field field = ReflectionUtils.getField(currentValue.getClass(), currentName); // 通过对象和属性名获取属性的类型 - // 获取对应得枚举类 + Field field = ReflectionUtils.getField(currentValue.getClass(), currentName); // 通过对象和属性名获取属性的类型 + // 获取对应得枚举类 Class enumClass = field.getType(); - // 根据对应的值和枚举类获取相应的枚举值 + // 根据对应的值和枚举类获取相应的枚举值 BaseEnum anEnum = DefaultInputJsonToEnum.getEnum(inputParameter, enumClass); log.info("\n====>测试反序列化枚举[{}]==>[{}.{}]", inputParameter, anEnum.getClass(), anEnum); return anEnum; @@ -200,111 +211,113 @@ public class BaseEnumDeserializer extends JsonDeserializer { ```java @Bean - public Jackson2ObjectMapperBuilderCustomizer enumCustomizer() { +public Jackson2ObjectMapperBuilderCustomizer enumCustomizer(){ // 将枚举转成json返回给前端 - return jacksonObjectMapperBuilder -> { + return jacksonObjectMapperBuilder->{ // 自定义序列化器注入 - Map, JsonSerializer> serializers = new LinkedHashMap<>(); - serializers.put(BaseEnum.class, new BaseEnumSerializer()); - jacksonObjectMapperBuilder.serializersByType(serializers); + Map,JsonSerializer>serializers=new LinkedHashMap<>(); + serializers.put(BaseEnum.class,new BaseEnumSerializer()); + jacksonObjectMapperBuilder.serializersByType(serializers); // 自定义反序列化器注入,这里的注入貌似效果不行 - Map, JsonDeserializer> deserializers = new LinkedHashMap<>(); - deserializers.put(BaseEnum.class, new BaseEnumDeserializer()); - jacksonObjectMapperBuilder.deserializersByType(deserializers); + Map,JsonDeserializer>deserializers=new LinkedHashMap<>(); + deserializers.put(BaseEnum.class,new BaseEnumDeserializer()); + jacksonObjectMapperBuilder.deserializersByType(deserializers); }; - } + } ``` -经过测试,枚举序列化后返回到前端的效果如下,与期望的效果一致,这样的好处就是前端不需要管数字是啥意思,直接显示`description`即可,无论后端枚举是否修改,前端都不需要关心了。 +经过测试,枚举序列化后返回到前端的效果如下,与期望的效果一致,这样的好处就是前端不需要管数字是啥意思,直接显示`description` +即可,无论后端枚举是否修改,前端都不需要关心了。 ![](./asset/img/enums.png) -经过反复测试与人分享成果的时候,发现一个非常严重的问题,虽然前端接收参数的时候也可以反序列化成枚举,但是实际上没有按照`code`来反序列化。最后只能把jackson的源代码拉下来调试,经过调试发现,jackson反序列化的时候一直使用的是默认的枚举反序列化器,并没有使用自定义枚举反序列化器。 +经过反复测试与人分享成果的时候,发现一个非常严重的问题,虽然前端接收参数的时候也可以反序列化成枚举,但是实际上没有按照`code` +来反序列化。最后只能把jackson的源代码拉下来调试,经过调试发现,jackson反序列化的时候一直使用的是默认的枚举反序列化器,并没有使用自定义枚举反序列化器。 com.fasterxml.jackson.databind.deser.BasicDeserializerFactory#createEnumDeserializer - ```java /** - * Factory method for constructing serializers of {@link Enum} types. - */ - @Override - public JsonDeserializer createEnumDeserializer(DeserializationContext ctxt, - JavaType type, BeanDescription beanDesc) + * Factory method for constructing serializers of {@link Enum} types. + */ +@Override +public JsonDeserializer createEnumDeserializer(DeserializationContext ctxt, + JavaType type,BeanDescription beanDesc) throws JsonMappingException - { - final DeserializationConfig config = ctxt.getConfig(); - final Class enumClass = type.getRawClass(); + { +final DeserializationConfig config=ctxt.getConfig(); +final Class enumClass=type.getRawClass(); // 23-Nov-2010, tatu: Custom deserializer? - JsonDeserializer deser = _findCustomEnumDeserializer(enumClass, config, beanDesc); - - if (deser == null) { - // 12-Feb-2020, tatu: while we can't really create real deserializer for `Enum.class`, - // it is necessary to allow it in one specific case: see [databind#2605] for details - // but basically it can be used as polymorphic base. - // We could check `type.getTypeHandler()` to look for that case but seems like we - // may as well simply create placeholder (AbstractDeserializer) regardless - if (enumClass == Enum.class) { - return AbstractDeserializer.constructForNonPOJO(beanDesc); - } + JsonDeserializer deser=_findCustomEnumDeserializer(enumClass,config,beanDesc); + + if(deser==null){ + // 12-Feb-2020, tatu: while we can't really create real deserializer for `Enum.class`, + // it is necessary to allow it in one specific case: see [databind#2605] for details + // but basically it can be used as polymorphic base. + // We could check `type.getTypeHandler()` to look for that case but seems like we + // may as well simply create placeholder (AbstractDeserializer) regardless + if(enumClass==Enum.class){ + return AbstractDeserializer.constructForNonPOJO(beanDesc); + } - ValueInstantiator valueInstantiator = _constructDefaultValueInstantiator(ctxt, beanDesc); - SettableBeanProperty[] creatorProps = (valueInstantiator == null) ? null - : valueInstantiator.getFromObjectArguments(ctxt.getConfig()); - // May have @JsonCreator for static factory method: - for (AnnotatedMethod factory : beanDesc.getFactoryMethods()) { - if (_hasCreatorAnnotation(ctxt, factory)) { - if (factory.getParameterCount() == 0) { // [databind#960] - deser = EnumDeserializer.deserializerForNoArgsCreator(config, enumClass, factory); - break; - } - Class returnType = factory.getRawReturnType(); - // usually should be class, but may be just plain Enum (for Enum.valueOf()?) - if (returnType.isAssignableFrom(enumClass)) { - deser = EnumDeserializer.deserializerForCreator(config, enumClass, factory, valueInstantiator, creatorProps); - break; - } - } - } - - // Need to consider @JsonValue if one found - if (deser == null) { - deser = new EnumDeserializer(constructEnumResolver(enumClass, - config, beanDesc.findJsonValueAccessor()), - config.isEnabled(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS)); - } + ValueInstantiator valueInstantiator=_constructDefaultValueInstantiator(ctxt,beanDesc); + SettableBeanProperty[]creatorProps=(valueInstantiator==null)?null + :valueInstantiator.getFromObjectArguments(ctxt.getConfig()); + // May have @JsonCreator for static factory method: + for(AnnotatedMethod factory:beanDesc.getFactoryMethods()){ + if(_hasCreatorAnnotation(ctxt,factory)){ + if(factory.getParameterCount()==0){ // [databind#960] + deser=EnumDeserializer.deserializerForNoArgsCreator(config,enumClass,factory); + break; + } + Class returnType=factory.getRawReturnType(); + // usually should be class, but may be just plain Enum (for Enum.valueOf()?) + if(returnType.isAssignableFrom(enumClass)){ + deser=EnumDeserializer.deserializerForCreator(config,enumClass,factory,valueInstantiator,creatorProps); + break; + } + } + } + + // Need to consider @JsonValue if one found + if(deser==null){ + deser=new EnumDeserializer(constructEnumResolver(enumClass, + config,beanDesc.findJsonValueAccessor()), + config.isEnabled(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS)); + } } // and then post-process it too - if (_factoryConfig.hasDeserializerModifiers()) { - for (BeanDeserializerModifier mod : _factoryConfig.deserializerModifiers()) { - deser = mod.modifyEnumDeserializer(config, type, beanDesc, deser); - } + if(_factoryConfig.hasDeserializerModifiers()){ + for(BeanDeserializerModifier mod:_factoryConfig.deserializerModifiers()){ + deser=mod.modifyEnumDeserializer(config,type,beanDesc,deser); + } } return deser; - } + } ``` 从上面可以看出来枚举反系列化器是怎么找到的.仔细阅读后发现,上面并没有按照接口 `BaseEnum` 来查找反序列化器,这也是为啥自定义的反序列化器没有生效的原因. 既然我发现了这个问题,我直接在github拉下来了jackson代码,然后修改成按照接口查找自定义反序列化器的方式提交了我的代码. + ```java - List interfaces = type.getInterfaces(); + List interfaces=type.getInterfaces(); - for (JavaType javaType : interfaces) { - Class rawClass = javaType.getRawClass(); - deser = _findCustomEnumDeserializer(rawClass, config, beanDesc); - if (deser != null) { - return deser; + for(JavaType javaType:interfaces){ + Class rawClass=javaType.getRawClass(); + deser=_findCustomEnumDeserializer(rawClass,config,beanDesc); + if(deser!=null){ + return deser; + } } - } ``` + pull request之后,管理者很快给我回复了。我们来回扯了几个回合之后,我们得到一个更加合理的解决办法. 这个问题,这个也是本文的重点。就是重写查找枚举反序列化器的方法,把我写的代码放在一个重写类里面即可. - https://github.com/FasterXML/jackson-databind/pull/2842 ![](./asset/img/github.com_FasterXML_jackson-databind_pull_28422.png) @@ -315,32 +328,32 @@ com.fasterxml.jackson.databind.module.SimpleDeserializers#findEnumDeserializer ```java @Override - public JsonDeserializer findEnumDeserializer(Class type, - DeserializationConfig config, BeanDescription beanDesc) +public JsonDeserializer findEnumDeserializer(Class type, + DeserializationConfig config,BeanDescription beanDesc) throws JsonMappingException - { - if (_classMappings == null) { - return null; - } - JsonDeserializer deser = _classMappings.get(new ClassKey(type)); - if (deser == null) { - // 29-Sep-2019, tatu: Not 100% sure this is workable logic but leaving - // as is (wrt [databind#2457]. Probably works ok since this covers direct - // sub-classes of `Enum`; but even if custom sub-classes aren't, unlikely - // mapping for those ever requested for deserialization - if (_hasEnumDeserializer && type.isEnum()) { - deser = _classMappings.get(new ClassKey(Enum.class)); - } + { + if(_classMappings==null){ + return null; + } + JsonDeserializer deser=_classMappings.get(new ClassKey(type)); + if(deser==null){ + // 29-Sep-2019, tatu: Not 100% sure this is workable logic but leaving + // as is (wrt [databind#2457]. Probably works ok since this covers direct + // sub-classes of `Enum`; but even if custom sub-classes aren't, unlikely + // mapping for those ever requested for deserialization + if(_hasEnumDeserializer&&type.isEnum()){ + deser=_classMappings.get(new ClassKey(Enum.class)); + } } return deser; - } + } ``` 从上面看出来这个就是查找枚举反序列化器的逻辑,重写SimpleDeserializers类即可.上面这个代码是无法按照接口找到反序列化器的,所以重写它,让它按照我期望的接口方式找到即可,最后也成功了. - 此外还从源码中分析出来 -为啥有的枚举反序列化就能正常,但是有的不能完成翻序列化。原来默认的枚举反序列化器是按照`ordinal`来反序列化的,也就是说只有当`code`与`ordinal`一致的时候就会造成一种假象, +为啥有的枚举反序列化就能正常,但是有的不能完成翻序列化。原来默认的枚举反序列化器是按照`ordinal` +来反序列化的,也就是说只有当`code`与`ordinal`一致的时候就会造成一种假象, 以为是`code`反序列化来的,其实依旧是`ordinal`反序列化来的。 从下面代码中可以看出来,枚举存储在数组中,而`ordinal`刚好是下标. @@ -349,46 +362,46 @@ com.fasterxml.jackson.databind.deser.std.EnumDeserializer#deserialize ```java @Override - public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException - { - JsonToken curr = p.currentToken(); - +public Object deserialize(JsonParser p,DeserializationContext ctxt)throws IOException + { + JsonToken curr=p.currentToken(); + // Usually should just get string value: - if (curr == JsonToken.VALUE_STRING || curr == JsonToken.FIELD_NAME) { - CompactStringObjectMap lookup = ctxt.isEnabled(DeserializationFeature.READ_ENUMS_USING_TO_STRING) - ? _getToStringLookup(ctxt) : _lookupByName; - final String name = p.getText(); - Object result = lookup.find(name); - if (result == null) { - return _deserializeAltString(p, ctxt, lookup, name); - } - return result; + if(curr==JsonToken.VALUE_STRING||curr==JsonToken.FIELD_NAME){ + CompactStringObjectMap lookup=ctxt.isEnabled(DeserializationFeature.READ_ENUMS_USING_TO_STRING) + ?_getToStringLookup(ctxt):_lookupByName; +final String name=p.getText(); + Object result=lookup.find(name); + if(result==null){ + return _deserializeAltString(p,ctxt,lookup,name); + } + return result; } // But let's consider int acceptable as well (if within ordinal range) - if (curr == JsonToken.VALUE_NUMBER_INT) { - // ... unless told not to do that - int index = p.getIntValue(); - if (ctxt.isEnabled(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS)) { - return ctxt.handleWeirdNumberValue(_enumClass(), index, - "not allowed to deserialize Enum value out of number: disable DeserializationConfig.DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS to allow" - ); - } - if (index >= 0 && index < _enumsByIndex.length) { - return _enumsByIndex[index]; - } - if ((_enumDefaultValue != null) - && ctxt.isEnabled(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE)) { - return _enumDefaultValue; - } - if (!ctxt.isEnabled(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL)) { - return ctxt.handleWeirdNumberValue(_enumClass(), index, - "index value outside legal index range [0..%s]", - _enumsByIndex.length-1); - } - return null; + if(curr==JsonToken.VALUE_NUMBER_INT){ + // ... unless told not to do that + int index=p.getIntValue(); + if(ctxt.isEnabled(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS)){ + return ctxt.handleWeirdNumberValue(_enumClass(),index, + "not allowed to deserialize Enum value out of number: disable DeserializationConfig.DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS to allow" + ); + } + if(index>=0&&index<_enumsByIndex.length){ + return _enumsByIndex[index]; + } + if((_enumDefaultValue!=null) + &&ctxt.isEnabled(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_USING_DEFAULT_VALUE)){ + return _enumDefaultValue; + } + if(!ctxt.isEnabled(DeserializationFeature.READ_UNKNOWN_ENUM_VALUES_AS_NULL)){ + return ctxt.handleWeirdNumberValue(_enumClass(),index, + "index value outside legal index range [0..%s]", + _enumsByIndex.length-1); + } + return null; + } + return _deserializeOther(p,ctxt); } - return _deserializeOther(p, ctxt); - } ``` @@ -419,7 +432,6 @@ com.fasterxml.jackson.databind.deser.std.EnumDeserializer#deserialize 调试过程中最让人百思不得解的是,自定义的正反枚举序列化器,序列化器是可以按照自己定义的接口来序列化,但是反序列化不行。最后经过反复调试,发现正反序列化过程有点区别,正序列化的时候会找父类找接口,按照父类或者接口定义的序列化器来序列化。而反序列化的时候不会。体会一下,可以理解成一个正序列化的时候,准确度可以忽略,反正都是丢出去的。但是反序列化的时候必须保证精度,否则无法正确反序列化,那么对应的对象无法获取到正确的值。瞎扯一下.好比,银行存钱的时候不需要密码,取钱的时候就需要密码一样,看似一个对称的过程,但是校验机制还是有点区别的,可以细细体会这种方式的必要性。 - #### 重写SimpleDeserializers的findEnumDeserializer方法 重写了这个方法之后,把我原本写在源代码的逻辑搬出来了,很快就解决了枚举无法找到自定义反序列化器的问题。 @@ -428,18 +440,19 @@ com.fasterxml.jackson.databind.deser.std.EnumDeserializer#deserialize public class SimpleDeserializersWrapper extends SimpleDeserializers { static final Logger logger = LoggerFactory.getLogger(SimpleDeserializersWrapper.class); + @Override public JsonDeserializer findEnumDeserializer(Class type, DeserializationConfig config, BeanDescription beanDesc) throws JsonMappingException { JsonDeserializer enumDeserializer = super.findEnumDeserializer(type, config, beanDesc); - + if (enumDeserializer != null) { return enumDeserializer; } for (Class typeInterface : type.getInterfaces()) { enumDeserializer = this._classMappings.get(new ClassKey(typeInterface)); if (enumDeserializer != null) { - logger.info("\n====>重写枚举查找逻辑[{}]",enumDeserializer); + logger.info("\n====>重写枚举查找逻辑[{}]", enumDeserializer); return enumDeserializer; } } @@ -456,18 +469,18 @@ public class SimpleDeserializersWrapper extends SimpleDeserializers { ```java @Bean - public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { - SimpleDeserializersWrapper deserializers = new SimpleDeserializersWrapper(); - deserializers.addDeserializer(BaseEnum.class, new BaseEnumDeserializer()); +public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder){ + SimpleDeserializersWrapper deserializers=new SimpleDeserializersWrapper(); + deserializers.addDeserializer(BaseEnum.class,new BaseEnumDeserializer()); - SimpleModule simpleModule = new SimpleModule(); + SimpleModule simpleModule=new SimpleModule(); simpleModule.setDeserializers(deserializers); - simpleModule.addSerializer(BaseEnum.class, new BaseEnumSerializer()); + simpleModule.addSerializer(BaseEnum.class,new BaseEnumSerializer()); - ObjectMapper objectMapper = builder.createXmlMapper(false).build(); + ObjectMapper objectMapper=builder.createXmlMapper(false).build(); objectMapper.registerModule(simpleModule); return objectMapper; - } + } ``` ### 其他序列化应用场景 @@ -480,7 +493,8 @@ public class SimpleDeserializersWrapper extends SimpleDeserializers { #### Long类型超过精度统一序列化 -本项目中还有一个应用就是针对Long类型超过浏览器可识别的精度范围就直接序列化成String类型,这样就不用再每个返回的地方都一一String.valueof()的转化了。 +本项目中还有一个应用就是针对Long类型超过浏览器可识别的精度范围就直接序列化成String类型,这样就不用再每个返回的地方都一一String.valueof() +的转化了。 > Long类型太长了,在浏览器里面是无法正确显示的,但是实际值是没有问题的,只是看起来不对而已。 @@ -490,30 +504,26 @@ public class SimpleDeserializersWrapper extends SimpleDeserializers { ![](./asset/img/converter.png) - - ### DAO 层处理枚举存到数据库 - 具体就是在枚举的属性上面上一个注解 ```java @EnumValue//标记数据库存的值是code - private final Integer code; +private final Integer code; ``` + 此外在yaml配置文件中指定枚举所在的包。 + ```java mybatis-plus: - type-enums-package: hxy.dream.entity.enums + type-enums-package:hxy.dream.entity.enums ``` + 上面两步,就是借助mybatis-plus完成了枚举存储到数据库,与读取的时候转换的问题。这个比较简单,框架也就是做这些事情的,让开发者专注于业务,而不是实现技术的本身(不是说不要钻研技术底层原理)。 > 参考 mybatis-plus:https://mp.baomidou.com/guide/enum.html - - - - ## 总结 以上的操作完成了枚举的从前端接收,反序列化成枚举对象在程序中表达。然后再存储到数据库中。从数据库中取code转成枚举,在程序中表达,再序列化枚举后传输给前端。一个非常完整的循环,基本上满足了程序中对枚举使用的需求。 @@ -533,20 +543,22 @@ https://gitee.com/-/ide/project/aohanhongzhi/springboot-base/edit/master/-/src/m ```java -for (Class typeInterface : type.getInterfaces()) { - enumDeserializer = this._classMappings.get(new ClassKey(typeInterface)); - if (enumDeserializer != null) { - logger.info("\n重写枚举查找逻辑[{}]", enumDeserializer); +for(Class typeInterface:type.getInterfaces()){ + enumDeserializer=this._classMappings.get(new ClassKey(typeInterface)); + if(enumDeserializer!=null){ + logger.info("\n重写枚举查找逻辑[{}]",enumDeserializer); return enumDeserializer; - } -} -return null; + } + } + return null; ``` 问题分析,调试定位出问题肯定不是序列化器注入的问题,因为已经在`this._classMappings`中存在了。那么问题只能出在HashMap的key上面了。通过调试 + ```java this._classMappings.get(key); ``` + 这一个比较发现 ![](asset/img/hashMap-get.png) @@ -557,12 +569,15 @@ this._classMappings.get(key); ![](asset/img/databind-type-Classkey.png) ![](asset/img/classmate-util-classkey.png) 很显然这位老哥import的时候包可能导入错误的了。 + ```java // 下面这个才是正确的 - import com.fasterxml.jackson.databind.type.ClassKey; - // 下面这个是错误的。 - import com.fasterxml.classmate.util.ClassKey; + +import com.fasterxml.jackson.databind.type.ClassKey; +// 下面这个是错误的。 +import com.fasterxml.classmate.util.ClassKey; ``` + ![](asset/img/hashMap-equals.png) # fastjson枚举自定义序列化器 @@ -571,4 +586,32 @@ https://blog.csdn.net/qq_26680031/article/details/83473643 # 数据库的json序列化处理,将数据库存储的json字段自动映射成对象 -https://github.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample-typehandler/src/main/java/com/baomidou/mybatisplus/samples/typehandler \ No newline at end of file +https://github.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample-typehandler/src/main/java/com/baomidou/mybatisplus/samples/typehandler + +# json时间格式化 + +### 编码 + +参考 [DateJsonSerializer](common/src/main/java/hxy/dream/common/serializer/DateJsonSerializer.java) + +1. 线程安全 + +```java + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + ZoneId zoneId = ZoneId.systemDefault(); + LocalDateTime localDateTime = date.toInstant().atZone(zoneId).toLocalDateTime(); + String yearMonth = localDateTime.format(dtf); +``` + +2. 线程不安全 + +```java + public static final SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateStirng = format.format(date) +``` + +### 配置文件 + +![img.png](img.png) + + diff --git a/common/src/main/java/hxy/dream/common/serializer/DateJsonSerializer.java b/common/src/main/java/hxy/dream/common/serializer/DateJsonSerializer.java index 95547df..496f28d 100644 --- a/common/src/main/java/hxy/dream/common/serializer/DateJsonSerializer.java +++ b/common/src/main/java/hxy/dream/common/serializer/DateJsonSerializer.java @@ -5,15 +5,25 @@ import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; import java.util.Date; import java.text.SimpleDateFormat; +/** + * 或者直接yaml文件配置也是可以的 spring.jackson.date-format + */ public class DateJsonSerializer extends JsonSerializer { - public static final SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - - @Override - public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { - jsonGenerator.writeString(format.format(date)); - } - + + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + ZoneId zoneId = ZoneId.systemDefault(); + + @Override + public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + LocalDateTime localDateTime = date.toInstant().atZone(zoneId).toLocalDateTime(); + String yearMonth = localDateTime.format(dtf); + jsonGenerator.writeString(yearMonth); + } + } \ No newline at end of file diff --git a/img.png b/img.png new file mode 100644 index 0000000000000000000000000000000000000000..3b9406546d0d66c6445206a7baf716a988f81581 GIT binary patch literal 20553 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%0A72M58qs890T8=styQQAjoI2^HtrcS>+J#H+5} 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Ν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 literal 0 HcmV?d00001 -- Gitee From b1e41e6a180fcb60fa24c50163fb860efca47c40 Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Sun, 8 Jan 2023 16:37:20 +0800 Subject: [PATCH 024/204] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SERIALIZE.md | 1 + 1 file changed, 1 insertion(+) diff --git a/SERIALIZE.md b/SERIALIZE.md index 2a9e575..42df8be 100644 --- a/SERIALIZE.md +++ b/SERIALIZE.md @@ -609,6 +609,7 @@ https://github.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample public static final SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String dateStirng = format.format(date) ``` +> https://www.cnblogs.com/xwzp/p/14685452.html ### 配置文件 -- Gitee From d581e0d3087e76ebcddc462ce02f2929d468dc1e Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Sun, 8 Jan 2023 17:21:06 +0800 Subject: [PATCH 025/204] =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E5=8C=96=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TRANSACTION.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TRANSACTION.md b/TRANSACTION.md index 96df8a5..379f083 100644 --- a/TRANSACTION.md +++ b/TRANSACTION.md @@ -115,5 +115,6 @@ Exception in thread "Thread-3" java.lang.ArithmeticException: / by zero # 拓展 +[详解Spring事务的7种传播行为](https://mp.weixin.qq.com/s/dzKmS2HtoS0Yt4dKFuwSBg) [分布式事务有这一篇就够了!](https://zhuanlan.zhihu.com/p/263555694) : 鲁友心推荐 \ No newline at end of file -- Gitee From 396b69e30a35bf8bbf92ddc6a1b659ea1482597a Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Sun, 8 Jan 2023 23:33:00 +0800 Subject: [PATCH 026/204] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/controller/ExceptionController.java | 5 + app/src/main/resources/application.yml | 12 +- app/src/main/resources/logback-spring.xml | 177 +++++++++++++----- .../hxy/dream/common/email/EmailTest.java | 32 ++++ app/src/test/resources/api/local.http | 3 + 5 files changed, 182 insertions(+), 47 deletions(-) create mode 100644 app/src/test/java/hxy/dream/common/email/EmailTest.java diff --git a/app/src/main/java/hxy/dream/app/controller/ExceptionController.java b/app/src/main/java/hxy/dream/app/controller/ExceptionController.java index 2dac4d5..c0089e6 100644 --- a/app/src/main/java/hxy/dream/app/controller/ExceptionController.java +++ b/app/src/main/java/hxy/dream/app/controller/ExceptionController.java @@ -6,6 +6,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletResponse; + import java.io.IOException; /** @@ -26,7 +27,11 @@ public class ExceptionController { } catch (IOException e) { log.error("{}", e.getMessage(), e); } + } + @RequestMapping("/exception-output") + public void exceptionOutput() { + throw new IllegalArgumentException("异常啊"); } } diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index 807d220..0a6ae30 100755 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -1,4 +1,6 @@ spring: + application: + name: dragon thymeleaf: mode: HTML #LEGACYHTML5 cache: false @@ -12,14 +14,18 @@ spring: profiles: active: beta #环境隔离 mail: - username: inform@islab.net.cn - password: Alerter.2019 + username: aohanhongzhi@qq.com + password: vtrxapjtpcivdbcb default-encoding: UTF-8 - host: smtp.exmail.qq.com + host: smtp.qq.com jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 +email: + from: aohanhongzhi@qq.com + to: aohanhongzhi@qq.com + mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: diff --git a/app/src/main/resources/logback-spring.xml b/app/src/main/resources/logback-spring.xml index 92914dc..5f7a6bd 100644 --- a/app/src/main/resources/logback-spring.xml +++ b/app/src/main/resources/logback-spring.xml @@ -2,16 +2,16 @@ - + - - + + - + @@ -26,6 +26,33 @@ + + + + ALL + ACCEPT + + ACCEPT + + ${LOG_PATH}/all.log + + + + + ${LOG_PATH}/all.%d{yyyy-MM-dd}.%i.log + + 180 + + + + 10MB + + + + %date %level [%thread] %logger{36} [%file : %line] %msg%n + + + @@ -33,12 +60,12 @@ ACCEPT DENY - ${DEV_HOME}/debug.log + ${LOG_PATH}/debug.log - ${DEV_HOME}/debug.%d{yyyy-MM-dd}.%i.log + ${LOG_PATH}/debug.%d{yyyy-MM-dd}.%i.log 180 @@ -60,9 +87,9 @@ ACCEPT DENY - ${DEV_HOME}/info.log + ${LOG_PATH}/info.log - ${DEV_HOME}/info.%d{yyyy-MM-dd}.%i.log + ${LOG_PATH}/info.%d{yyyy-MM-dd}.%i.log 180 10MB @@ -78,9 +105,9 @@ ACCEPT DENY - ${DEV_HOME}/warn.log + ${LOG_PATH}/warn.log - ${DEV_HOME}/warn.%d{yyyy-MM-dd}.%i.log + ${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log 180 10MB @@ -88,7 +115,7 @@ %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger -%msg%n - + @@ -97,9 +124,9 @@ ACCEPT DENY - ${DEV_HOME}/error.log + ${LOG_PATH}/error.log - ${DEV_HOME}/error.%d{yyyy-MM-dd}.%i.log + ${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log 180 10MB @@ -107,7 +134,7 @@ %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger -%msg%n - + @@ -115,58 +142,40 @@ - - + ${smtpHost} - - + 25 - - + ${to} - - + ${from} - ${logname}: %logger - %msg - - + ${username} - - + ${password} - false - - + true - - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n - - - 1 - - - - + + - ERROR - ACCEPT - DENY - - + + + @@ -177,6 +186,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/test/java/hxy/dream/common/email/EmailTest.java b/app/src/test/java/hxy/dream/common/email/EmailTest.java new file mode 100644 index 0000000..18c4238 --- /dev/null +++ b/app/src/test/java/hxy/dream/common/email/EmailTest.java @@ -0,0 +1,32 @@ +package hxy.dream.common.email; + +import hxy.dream.BaseTest; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSenderImpl; + +/** + * @author eric + * @program multi-gradle + * @description 邮件测试 + * @date 2023/1/8 + */ +public class EmailTest extends BaseTest { + + @Autowired + private JavaMailSenderImpl mailSender; + + @Test + public void emailTest(){ + //简单邮件 + SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); + simpleMailMessage.setFrom("aohanhongzhi@qq.com"); + simpleMailMessage.setTo("aohanhongzhi@qq.com"); + simpleMailMessage.setSubject("Happy New Year"); + simpleMailMessage.setText("新年快乐!"); + mailSender.send(simpleMailMessage); + +// 原文链接:https://blog.csdn.net/qq_26383975/article/details/121957917 + } +} diff --git a/app/src/test/resources/api/local.http b/app/src/test/resources/api/local.http index 291731a..f1bce40 100644 --- a/app/src/test/resources/api/local.http +++ b/app/src/test/resources/api/local.http @@ -49,6 +49,9 @@ GET http://localhost:8080/ ### 返回json测试 GET http://localhost:8080/exception +### +GET http://localhost:8080/exception-output + ### servlet -- Gitee From 31d1fab3894ebbe23d81c07238027707a82febba Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Thu, 16 Feb 2023 15:33:54 +0800 Subject: [PATCH 027/204] =?UTF-8?q?xml=E6=96=87=E4=BB=B6=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SERIALIZE.md | 112 +++++++++++++++++++++++++++++++++++++++++++-- asset/img/xml1.png | Bin 0 -> 59556 bytes asset/img/xml2.png | Bin 0 -> 65159 bytes 3 files changed, 107 insertions(+), 5 deletions(-) create mode 100644 asset/img/xml1.png create mode 100644 asset/img/xml2.png diff --git a/SERIALIZE.md b/SERIALIZE.md index 42df8be..4db64a9 100644 --- a/SERIALIZE.md +++ b/SERIALIZE.md @@ -536,6 +536,107 @@ mybatis-plus: https://gitee.com/-/ide/project/aohanhongzhi/springboot-base/edit/master/-/src/main/java/hxy/base/server/entity/enums/BaseStatusCodeEnum.java +# mybatis xml兼容处理 + +mybatis的xml文件会报下面错误 + +```java +org.mybatis.spring.MyBatisSystemException:nested exception is org.apache.ibatis.exceptions.PersistenceException: + ### Error querying database.Cause:java.lang.IllegalArgumentException:invalid comparison:com.bosch.project.install.domain.enums.InstallStatusEnum and java.lang.String + ### Cause:java.lang.IllegalArgumentException:invalid comparison:com.bosch.project.install.domain.enums.InstallStatusEnum and java.lang.String + + at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:96) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:441) + at jdk.proxy2/jdk.proxy2.$Proxy140.selectList(Unknown Source) + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:166) + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:148) + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) + at jdk.proxy2/jdk.proxy2.$Proxy183.selectSpfInstallApplicationJoinList(Unknown Source) + at com.bosch.project.install.mapper.InstallApplicationMapperTest.test(InstallApplicationMapperTest.java:26) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) + at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) + at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) + at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) + at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74) + at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84) + at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) + at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) + at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) + at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) + at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251) + at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) + at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) + at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) + at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) + at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) + at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) + at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) + at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) + at org.junit.runners.ParentRunner.run(ParentRunner.java:363) + at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) + at org.junit.runner.JUnitCore.run(JUnitCore.java:137) + at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) + at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) + at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) + at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) + at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) + at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) + Caused by:org.apache.ibatis.exceptions.PersistenceException: + ### Error querying database.Cause:java.lang.IllegalArgumentException:invalid comparison:com.bosch.project.install.domain.enums.InstallStatusEnum and java.lang.String + ### Cause:java.lang.IllegalArgumentException:invalid comparison:com.bosch.project.install.domain.enums.InstallStatusEnum and java.lang.String + at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) + at java.base/java.lang.reflect.Method.invoke(Method.java:568) + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:427) + ...40more + Caused by:java.lang.IllegalArgumentException:invalid comparison:com.bosch.project.install.domain.enums.InstallStatusEnum and java.lang.String + at org.apache.ibatis.ognl.OgnlOps.compareWithConversion(OgnlOps.java:98) + at org.apache.ibatis.ognl.OgnlOps.isEqual(OgnlOps.java:153) + at org.apache.ibatis.ognl.OgnlOps.equal(OgnlOps.java:814) + at org.apache.ibatis.ognl.ASTNotEq.getValueBody(ASTNotEq.java:53) + at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) + at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) + at org.apache.ibatis.ognl.ASTAnd.getValueBody(ASTAnd.java:61) + at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) + at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) + at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:560) + at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:524) + at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:46) + at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32) + at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34) + at org.apache.ibatis.scripting.xmltags.MixedSqlNode.lambda$apply$0(MixedSqlNode.java:32) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:32) + at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55) + at org.apache.ibatis.scripting.xmltags.MixedSqlNode.lambda$apply$0(MixedSqlNode.java:32) + at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) + at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:32) + at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:39) + at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:305) + at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:82) + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) + at jdk.proxy2/jdk.proxy2.$Proxy238.query(Unknown Source) + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) + ...46more + +``` + +![img_1.png](asset/img/xml1.png) + +删除下面圈出内容即可,其他不需要变化。查询结果映射也是正常的,没有问题。 + +![img_2.png](asset/img/xml2.png) + # 问题拓展 有一位网友搜了很多的文章内容,都没有找到有效的,最后扒到了我这篇文章。但是使用的时候遇到了一个问题。下面这段代码总是无法获取到已经注入成功的BaseEnumDeserializer对象, @@ -597,18 +698,19 @@ https://github.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample 1. 线程安全 ```java - DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - ZoneId zoneId = ZoneId.systemDefault(); - LocalDateTime localDateTime = date.toInstant().atZone(zoneId).toLocalDateTime(); - String yearMonth = localDateTime.format(dtf); + DateTimeFormatter dtf=DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + ZoneId zoneId=ZoneId.systemDefault(); + LocalDateTime localDateTime=date.toInstant().atZone(zoneId).toLocalDateTime(); + String yearMonth=localDateTime.format(dtf); ``` 2. 线程不安全 ```java public static final SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - String dateStirng = format.format(date) + String dateStirng=format.format(date) ``` + > https://www.cnblogs.com/xwzp/p/14685452.html ### 配置文件 diff --git a/asset/img/xml1.png b/asset/img/xml1.png new file mode 100644 index 0000000000000000000000000000000000000000..e57be969a84595d422a156e075d2696552b69943 GIT binary patch literal 59556 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 literal 0 HcmV?d00001 diff --git a/asset/img/xml2.png b/asset/img/xml2.png new file mode 100644 index 0000000000000000000000000000000000000000..9027a9cf3660c7026a17349369889b4ef719dccf GIT binary patch literal 65159 zcmbT7bzGF&_Wv z`g?&(f?664qbj6v+w{rZ2gNP*rt4W^(e0Raa*5TO<5`h0ne8(%j?JWInRd`%9>lgbV13?o~ipoPJkD7s*JonyD)m?w~$s8a;loVULKY7O~FCP zZUv*0Vp_HJW{-Ca*;kjtk~kBSfx7l?fL&x+e%Hae>(LIl?Tej%LASlxS68dbTAdXh z0+E=avNHP_GdlXhhP*tLwA$C)&KUEqc6$5!vzy}eS~PUk7YrWX8#H3}c{*e>Ivt(% z?%wlEmur8)2|BZSS78c3kzg!3n3_4?W8D8#@or{RnFa`HO3*dys~?No+HB^K-f?!}4@tjtQ z<+0yoO5vCj3fFFV_P}(8Sejep)-XDoh_W+@c-Fq9>Z3Fi|M7-C^ar|&gZ#VW*S3=h2^mc7L=w;bci?IHR-IQO-19r}sL|jhRHtK#yhDc-^*eS{hag|SG zoZ3HCYwNmzHEh(hu^;AS`E?NFMo!H%-4(18EXY@;r|-yja$@n-!@25iBI|tQl&zWa z-Lj37>ew{ocBAQIxblE^yh>iC&$v?7FTrhOH~mjloL6umXx2n>?(4G}vDDxCcYh)=vZsAtPzkCH@JAHpA5;OGn{ij!gkS z)UNhJ?a-}fH2dS8r3y2Wz+|XUF}+)46txD2YU$l#RcPFRtW2G9qXl&0jOr|t#-%0ogNXS_udWjEUhGdOfz`vR9((F*h^#^ z>z=Js7`^F&b9^M^;TQzjd78Yh&JO7AuTJ=!==|0lm{asVcSVXonjsHSPbFdp@U?{B zZ1TX$_T__(na|)8>L>ZM9(w!>klNK%Pv#=FcN;2SDXJFhJJbOcu1Z+urj`egndO>b z)?Yj+;8D&JVhWpbvAxPYJy0Kk?DOv}GA`FcHh{3Rh3O$Cf8F-s%Cizn9(?D6`vxD# zVq{vgWD-V$@bXBqbl9T8Opo#O_96~h|5996{eiGsO|vAJ{eG3{uBJmC2>aQdqkr)h zrZtd?eo9__spY7OvMphirU!_Buc?xW;fDi8)IaTeap4l~MnX)0|}&=>;q^)Aq~BT8ofMfJ#__4UQG+MH&-Vayg=o3ZJ`57-=Zv zvA50bV*6lJUjWllCNoaPm`b*33XI!nSy5ewVrrMZvAa9Xg2srV#S=Zp0T-AW!cY4{jfdD z;-(!dt^%~2968le=2n8Q@&0&Vm$)oVl$pUhPr>@lgt7Z^dBBg6v&0hYBpMm8VkXmv zo?h@ZnM|H6g_s|1T=k2g18;OHOdN1tjj@CkAYB$6J{ev#kAUu;HUkozOk9~)n6yp{ zY5O+lEH@vv0|&J^u6y`O=^J%yT5L+)Qvg-76UFC!c1=D?BC2@HyfZb%cqV-EeFEy9 zJ@EB9#-W`wujO`rHP+zN?n?gZb%`LHNHx?LHmCc(33!~i(}IHn zuHTNe{703llnhN0bYMSC;v>?Zq3kE%UKd2&TTAO$ue%bcZtM~V+L}&v(0}?)bh2TYwM#lI1UkDQTe*{4U zgor93E5nOxCaMD(5>C`Ve)sLYp%6)Dz@y)vUcC&0JolSr`QyU&M?jd@D}ragKfULM zoAXM)6KGI5h96;A?j`o5thxkx2p9nh$-Py=<>5I(sb1{~DU8kzu5QqVxpj zW6theN7=c%tb{mGH@9!W(-`x_3E*Q7g7vFU&*;-GzXU;kkAy^65f^L_bJ~BBK&zap^ zlIM{-0%gHL(s^Xh+$!jd{r-c~Uy~+rCJKETp~cT-a<^TmcSjK&w~>(78k&JjfTo*< zQ|R`rm-g42P3f8sU9I^v|YkV>c596 zVwjiqY9mZ;(oMb0W4e7nF5^1TLDurxYXVwpXKx;rdB}HoB?djr@9A(jeoxSOw!%oTZV>eQ)^u_j~|De0t@jY9ci}2?mr?gV4j) ziEM~`Q->Sa?!y|<#`5Fu! z9U~ZiFPlt^V-NV361cx#`&f{3D*}R_HzQ5ar~X90{gpkR-iVORV4c>gTQ?@Q#E(zm zQB@%r{v#5EPi@YVvYI8vhFBq)v9j7+*ZQkddl9=LlJ<%($@u903J=0B7&5b2pLZAC z-&n!!n~Uye2&y@FjvjsZIDT3PiF5hI+L_ra`jM29XTG!+{C)EK(+D|}%1W#kfi>wg zQg5!*)gjs1RZ&_;$OU2Mao*YM!Q zA0)>z2xG9iRc7ZobT_0x9=B{Ysg#L0=_PCs@MS-Cazk&xBf*LT3J8kP%FQ2}M@Usg zz~k*;1p0zJU9_JZT{QAoa(s2Xd~n7)i>g_xu*>f-EdC(Kha=<)L#0-CYWd!{q#IbNs|H>wAa0Fp3D`jdtTYoDz>Yz%_s z(T7lG5Z4F8`|i}LXfel3ns5l2L*;45K8iVKMK4ZEwb~`q(N{gZnq6s`#8L05gG4z2s*69X&9Tk#ix&O$rVAGHTty|##MK7C7@D~q+9LIFCovuhdx?3G zh{*vB1D#~nHFnMhaf4olFTrHvaDLTz7we7V=&Ck^| zxm6>JH6lCoSKY*TCsT|E+jLOR(jP-4B`hr9PD4ZGvjRhg+x#))vF+W7>6%^&pYwX2N8Gnp6rIQj%n4Z=Rk(Xp)QOciZT-XOANuY-6?theC zw1Qev0BA)>&7Q@n7j+mTt=v=Qep`$G7DD!_@JSRq5kOJeFiwDX9x+Fw>y;k?*!O~_ z$+VW4(oCo`jsDWc-}0H6|7eA8klu?zz^Tj6EwTU_WSg-piYe{NyJIyzt@yO9drn%9 zNSaR*CIn{b^QOefJL|5`mhBGn3vysu3f6_Wt!5dp1=-}%FF|ex3~|q{&Dr*u8LJYJ z#ZBsfsq|Jmtxe?>*wFygn>CEVks>n4?tNr-bW5&fz$w|qUHJgA5BDmVI+O;3h4IIlm#M5mdYMjoE zbrBqP~M09POU2o%A2Q_hoQuY+p>v|MoN-!p{LS8L3J-jD92D(~EkZxgv%^_)g0I=S_D6p;wOS8+CPyGGw9+HEDIL z^rrV~i#{9aW6D#u7#Ip;tNjN^%h|;h+fO^)+jYET|ND^BVyHCE)*ol-8{&EIJ;Vi4 zdUt7&>>PVhF`)(hP9d*TAzjMON7SSNVWY*Ss~1*I8E8N3l)Bo+(-o*+%1_wBHN}@m zFCO9ujXok=KW!u~6Cx5+E~Qb4{hZo(?q&rdB2=O-VF7C9p~xaQFpLm9o@5tm(YSM$ zMdhfLEL6;KkvLzgYc~(fEspNkVsq9=9LrD%SsZE$m8PFX5@Ks?8r}Ga^9}20PV3^N zfylp!d);~W*j`|S0((i-NY~s zcba$7R&g0sH49W^P(OlKQs!4z7NQL%p1mXsOrV$N;@WIA9s6X>_RwdV9Dbei4MCgBL-W zK!r$@1)>I;4YA1R=&x2|w>n(h-bB(`{Ow8fHVu18cfN>l>vjIDAyzWd{3R6th8$Ng)N3;1=x?2abqLt+HP zjM3Qf-!1x!854-yQ{I{})lSB$n@iIhIj60wpe?97D9>t{u_n82=gsKomg@t6?7mg) zqYI3X{d}g6{Tq3u%Q`OeGbHvx2{xv-=jU+;ymCfj$`@yo{inE3o-+%R-^|Td420X( zfBbBIsD8`hQ2lHq;_dnotor;X6QCY!%FX7ye>ENclE-6{B?R}G+ ze+ANk75gV7V_Jq$LvMxw9zYo1u8j?m2(2EP{9MaI|CFSb5L>K^*)QOTkpf-ArQ5#v z&b@Tz`s`Rv0>o_c5Y zw<&8Bjn79g!MG(;AtrnbT+X31J+|_{WDoNFa5zkI)&doHx~(VmveeVeMVc1V8G46R z#}<`rX?qamc$IKkemi%k_#>VkOsxDD!NFC7x0M?6>P^bWiQ+@h=fk7unZL}@4siAR za-;5>8`C!0g*78z->V5n?`@xwC2bq!lp138%G5pXBZG8nDfG9oqm-i*XU9s z6Cn0sGk~@eMg!?zyIjJAzk|*4nlJpURSoa=XdA}aI%k*O-&AyK8*)x~l$uB`09daT z0)r zm8X4C_^>xH>v& z(e`ji$s1WJ>m#5A-inZ4)YVi~)^&hblFA&9#(6*SlT1;^UJ9J(Gc?(qmtLQ_4~iM4 zi+m)YE22mW0VKlmKh+)7dHBk)A)l~C9i>6;lh^ZVrMrFrQ#vI5zY;d6%M2gt2Q1Fb zoAK4^yo0cVXc~cg`*U-iJ3&6>@vCnz@Q|IcgZKBi__xk7C>nZxqc+T~2%;I?&TIaj z7#tH0_oW6_foc1Zb{LVM6?BJ?L`=bgN^ec3L<=fSYF{R{eyvzJhWJ>kTq2Wj3ZJo}9V z1?c&ah2Bp0^OP$J9T9FU14-9OBAxyf7z={bI@}j{q+~l;b#87<9q}o9wH%js0_4LA z=F?EuH78B8+>iQpR^4y0hd`AgQ}bZSUi}xxZAk`a^zBsq3snXp!?Po`1OgKdprW1{ zTyfderwqg`@c2T0i|meAHM;0*>5g+&pDXYtmG(WmFTt?QZC!b9%R9wiiL&jbrj6X= zxt;pFdDs0LbKOB%IUsRz#*J$RZBQVV7+rMlR}<{ecRBdiH!9a+=?V%B*8$ezWrZ0q zO9P~!scTXfMKV6aXyhlaJYo7`FO2$1_Tq*Gz)i5R#-@yy zV|kC>A$ImDnteTA6go=im3{2jOEj(J7)?|inDEY7h=Pad;UP$bH(nGKQ3u{3_pSzW zmf6($S&+AH4BDiZxn*uOfy9VDi+z73gz6bik_H} zrD4YV6;L^p$M8GKtIYOMA92T~p1o+Bg22F zOEsOi+12wfB1<-+r&Az><`agfpI)g{>!W5T>nFuv#-Q#N(tgHJKX3@FGzb~%X zEMT)8u?+$B< zi<2K8{G!P$$ET)E#>{$Rlp-nfa!>X%^xu3KMShaJic&KAd4NC7@%FpK3F`%lT$1I2 z{#uNZvzBt+l3}*N;umxi-?x;kh*H59gf8JnITU6A^dJj&GC*cguTN?A>S99n5QSKy z==38=e1#wgFdP)fFgGOgriwV45FXftRbS7d>MG7wv?7~7%c{>itCbtj4WtzRO6KuV zmNaWX9-!Kj&(s?$rTuz)w<82{!`9!z2m*eV9rdDQs8XvY z^e>J=U2305o0WcTL|l+iXy~FNcEC|DMczn2hOs?U#RK2&>oqz=Y9Xtlzz`D9{U-L} zr@?%VQK9PbMmJo3oAdAsWAO@x$~O8Dfgu6*Xgo@g$V+Wf_2o9d0|W-Enc4nNF&?VG zRDY(cnK{H9gu)Tq)CMq$PGss{ov91-Mc z=5%;Bf3K48+4=Zt;6v&*ipqNHcE2qTb-5-phkp$7fSz-j0O`d-R&}y*(!~~DQ+w}L zaP(kx*Vox4p3c|}NX%V~mej#!MZp?w>W6(|(fq`IomA;CPY_z!XyXdkzh-kMRyUM# zLg@*IcYGQUSZ4qV9+Av5aa{&v7{?~e;vcK*uUbMh44EmV*z$kn&}qul06y75E=s?v zX@@v*Uigk}9t|d@bq>8RA~gF=20f}}Kp72W z_J&Evc*78diOYF~CCB^{c)lSsS_4E6(JXCfJt!XyG1bOXJYv z3<57ujN(Lp(7bE|)A!`1Wrg3bqz)XomR>0)n`H9K{9vRXLvjp(48FChuVEOm3zH09 zkFx_&;#nQRH#pkHIB2E6H%$5cD>4vZ3&hs2?`;PbQm<)slG19+?_FjE#Wc|X32k?f z`>vk_WIvH)XdXCxE|2`UHn5us_=YcA*oJC`q&5wsAq|n15mXc6n{HknlOF=9ds?c+ zKh@ri>k?)X^6HE)x*W&Ag8)~x(L)79F~2;Dp=g+wLety;ay@kOm!?#uL9u&xr1|-i z$IRMpyH_=Z0s~_yBt^}GN2R0vFqVCNw!i-jF{UQ}hnmi`J*@A#!w$4hji#t)SdK_D zdQPSWwl5Vowm1E}(umL*a`FQx{*oxdY4VS#5Bf zeA4;WgqvTYZHnV##qBsJD^Ce@xUZ$_J5gHlubBiiUQ^jT~yUVT{(t zFZC46O#Op{nQ&b>iK)4Qe{sHDa^%?ybCBpK2OV`X6gOX^i{7LUeS@rLW&?DygAC#| z8M6!2BLiotQSarH2do4TF<(5q`p9_{?ws7Pw+l>A!1Yi2taGiSa+w#1LO#419aMe%a`sNE(Bt zy)2?jCp?iMImUfsbI_6nYLYCRQgsXu7l3Un!u_0-p2AlQDxvVatV(54g#cijJME?t zWwLTfy!xp{~g%b@$LzQ~Iq8fg;(&QwV8TuLD-A^pBOcv0MPJhgPR!v*nThA({Sm$k^1UA@U zEuTNj06+En-PTaIv~IA8*7j=&&x1Kg<Ap{r)3a7pgA+Cw>BJRi9)8cip|L;ynO|E}X^6G+jw)i`S) z>+WF`S^D+Iq+>;P@wAE2oqxoB2R1Uxtg3gKF7V21--Vr2QsJ}Ov~L0>lV`n6SjIa#AjoOeq=$$+5smoq;ORw^v*>;*yR zuB+~PsLjEczCz_RAMOD55wbj*wzk`z)_jt7%04&cg(iScl%d1MUM^v)+-!MoJ|?=p zL23K2WVpn`mWdI~eri_S{g1&XGLWKRT-kZ1U|6h{Ku;nXYeyZxx>^SX*k3(Iqmr$O zMOB~c-mqNk{Oq#BS;`!RS1Qi4H}UemGFu5~-QRw>n%a@vgGTQIxD_eX^u+`HYo?@c z5R=mc$t1YaYU)jjZW@$)a1qrLniH3H)PH`=$Qa?uOb@-B6-}ox`ErO33EB_~hD3>| zNX~J6{K@M@pt;O(eX1%>N-X#Nv%vX7 zfI>se>9>Yo0@v_gVHaHvPEEBjgI%h4O&E<`eb#9ezCHE)TD)+*SF7uhlK7@XF)*%) zoWf9xPX=H;m!|*p`yVntHC*O@O1-vihU3rcsiFRo_XF9NV!Yd5tSr;*4ak{Ky zq=;vDB?q;9UU+}Y|BcUqgpgJ(LRg-7gX8uut}(=iTBMh$Xp=6yS_wpas8POWCtG5M zmjZfy9%`5WqxNuD1%#2L!^;rxKVD_e|Bs3$`=6CNgtunDZHE7ldmLV=BqD9csC>-j zQ-*+HH!HCsGpS~qS}NN~W%;|XMe-a7W9el-pGhAs_Rwi^c^9aL41LqOwG}8)l*}bD zAN!6f<7}n8C@@#2xs`2>PH58j!Gx9MCqNkeE7~OE1Wh_Ev@cuiOUXp6HZY>LXk9gr zBTH!U;*UwBS8E41Vl;F-6K18Dpdc~e3msBTp)=^%wZeCW&=J)DW-c6=$j=l;#~iLD zu<4CoxLtb%( z$trANqrQE?i|oNBuP73bC*nA7&v+_b;+~1RcG}5VFuI5vEiWauokbj1poFj5xnx{5 zOo|8km{u%?EzWuE&9NFOmS;(E>ed0H%{8R`6A1}Rx)vxqI1g4JkbW>+_LNjVECHtp zt9oIDFk+Q8%DugR{tYclb6622uzXz*C9V8|#M$4}&}r%GM&td!#ys_w%C=PqImc+) zn`1K*vx+0_mBn@@%c;2dhKLBtf78+r4PN*)yOExtjNqjovKA=9#^I=8Fm)WZy{1o`x~w5maxEFG3l z)FOFh+SlW%UJ4O1CfM+hEq@Ehe?Fb+l-wog9j)rVc`!FW_A{QY2s~+bzqFg&@(kG6 zyF)kEH0@b4ZeGos!e&8F*v(LkgjRr_5YJSlEV+5rpIgCKWX&{pX$s6P@6=KKSftIx?D{G_Bo+cCjdYrZmESk%5H9SWZ06KaND`{2yOcWgtPXX1|XLr0Ul>q_|c zlZhs8leFC3a~kE9)D@=$1gcM(x>h_!9)&|Jtb3Ta`Zt9Y3z|)iJ0_>_Z<(J)*j(Pt zU4KbvUa(|OdD8@S+Y=9bd!I}lUFnS_ZRu2dfF66u3&Q(N^Nj>?{};_iDr&c;zT zEv_1$Jn*HN5Xo*@*58OPL+9yD@}+ z3PcJ)BL(>GwcoOsP+*BABBA_OL_?{>#sNne`s~?)-}mX-;ICAJ>q^gcv|QWj$c5p5 zAbhWq2R!oB$p(g_w~!p-p@~kRmD)Q^B#-hYwfH;1PuzaTCNs~S3$GELGR z3mJd^UosKd4bgCbSBY&guZio_$=fu)o}ooeEnHImH$F%_h$d4;n~=8g)bh_(Gpaf@ znZzGoGCW``2qbVfS@!dX79{M)?NpxPQyJHiGuKR#@aAls-pX1BFTe9F%`5?D?C!hK z8dmsSKCun+5SxvH%JFgH6S6d=Y75joGhGw zFnZ4G6%R^D;&y4E_L!qhwp?(Rz5IDxUv)T!gp5(RxJK`JqEc00e zUt)nFI=pUc8S6f$sH0q1I7x4hx#Z~AbtkPpui<<}w5>I-6G9aFKScxdki%6=q<<&* znzuJOC?C5gWY&F8wpLAIGMC%;zY<#=mg^zA35`Dy+0A^I^2_P>hRYIzOHu{ZuSE?t-QCExTTp^<&F_&!%Sqh8OVs z>IuQ$iFDV%|CLBvBH5J)PS`@j{*Rp4Pn{?8u)g{vTd}dWkLSUjk%t@ zLkC>E?T`(el2c~hAxu5Ri2HV*Am|CfcBk1-D6ZST@q5ubzxh4;qu=}3Hp_?l)q^iMSj5X3O+D+*A$DA&(ea}?5Z~B zK>Q=#B$N@V!+r5u7rX4hG&Jv7{tAx$wCYw>2xel12pzVGEt>7#n~Wm)?5f^5y6(Hu zS&SIZ-KF-EA>{Tz6*zT(fZ+2x0!Bl-8Y4cjPfA<4%QzMJx^W2Pt<3?p^M@|z702R~ z|2rZ1FGz1%k`%4r?|fuM44#ivg8p|t0?)gNtB&cJUFYS@Ma;}5;`Rm(1CovS#Gwn7 zl_<>V&?*fXi=uvc?WU8B_3SLv`$`kIN~6ltQ2lM_t-Ut%U->|yo_jO!H;31at8cOw z%8>dFh>fA~d76s7@wwo4$$>^a zm#@#}6}C(9Ve5pd#>7o)ZtGe%+!v-5dFp#H+s=r20i{eW4y9H@Ov8>T(KjWc^0=Sa zcp7qL>}JD`91i`?WlIkxuK-1MMd>LrGEcNQY800r@XJDBP;UfdmS7OmSqoI}V9Ymk zo33d&1fLhwC|pu?yEeI>QxdqBPR!7XPiVHN0}?o?{K?dOEs}37WK}-uVV04OJoo** ztVao`d)P_B6Qk_NKDaBRHienaR-ulX65EVP0KN#1Vh=uEQ$Gx@Md}q8ok)}K^4i<3 z^9Sw`v~H3F2|YTwOI5QWg*cCyz$XlZ@@8gud@1?0E?_n}r{-d?$>r$8#i`l8jM(FW z+I-LM-Rpt$%1C>p{RXCC{tEI`SLgK9=Ty9!PO|Jh@(#0x8Tm=u{>{q*$ZqSLa>h@S zlZPiG_@R*9kYX4GSM9p1!LJJIQnlF7kWz_~lFtA0AbT-T^qa?di~4_`IsbrlzGeT$ zXW(~Sk-V7@cPu;9UyFGB7XtR5+?>bzzbPO1*pdDMhn|q#JRPpM_-SKhbhksCcE#c8Wb-^rr)l#g21O`{p3IqIUo+a2N z`&OItxo2z1eXG;?y=ztt)pNnNzqzF+WQ}+@tb6xPV(Ma&OR;s%(ks4WJ@7Nlf1oCV zoPP~X;Tk@Sm!rFl>GzL2ZBRA=v&^kif zxLL5o3ix}N?4pjlFFp*G>$F<{MMPTx-jLIWvN4q@&R=QqIef>XF-cHX}D*hUFjbWB3;@R{-bbVhwNd&uc5R zrh+fqxDPO>V`1~gQ&B9YNz|f_wW9MJ^M}3=653_*;9%}<3s2%9`K*7zdKhq6?>}k> zkF14jBA5kDZr5VB5VcPz$9vN{g&UsJ-R*^&RRYtHvi`&#KaITtYd=bIO&Rz_TzcK3 zd73v+|4hZ_uzzp4%Opam(%qaNLndf3e^J8mKLp}CiN}ArEV(opUxYN)cGz;k6-d3& zBRYNuoTjFByJzge#W!30{rjRg)HzZ4^svmTb%~arQE;mfG2e*%LPLD zsbbHkJrc2Po|trXvWX#G6H3j7u(qOw7HJF7t4Cuk84@#ql%fkYHUtDwx}5)k(7|;T z8RL;swV5GWZ@Yyt^pd&9sUzv|pdNz!Sw9zj;o6D2EPp)LAgQu%IOA9GeEwS+X~ZB1Y&ZgSFmW)Y3l z;!G#i(sE}F{p1-cRr>G-n~~hLmzMk|`}~(2AWsxRl0OhUW{l%&ti+BmNNF*DD~E?p zi_*)xemG#1!>9aiW+bTp_~g1?_YsM z8#9Z^C=T80r7)6^5iX7Yg;6^;-RNVMkk<$?Rjxm&jR~R9iwVgVW;ax`_!aw_u2MX- z>*bok)be^89$gFb6H+x_mS;Hb2Cj=nCFw^+}leE&}68=OY!7O37 zG$w(vyM7oo{T=~9Sv;P#V?6onRD4tW_qxlv%cr^(HcNvahS<%`>Djc*e7}B7w%AFd z2<&h{k2BzR=fq?j+gpy#uV6(wdb2~=InkrxHr+D2EGJ%bcM;{WzAtH;wf$@o33HD*@yyVS-_|2>+@eEs&R7Gw))J~we zAn7jGA8N;D)!;*VQvXRAf2U}usKHXYj|dpKa!9$>L09e0?F z;GrG*jrt_>Z&qK_HfF9M^f5w<*ccWVi`({iA>}H)DBvnaQYCu(`ujijeN_?ZXP#DA ztdP(RCQ1iP*?-S{Zc1Myu;I|6e#-m^2(mQ$yj91D3^m5@U(T zF-DtzHcMMoV2__Vr-_x;*uCgcknD_e$B%n${Y+&t=c6h~;#+(P)i1XBI6k6H{x({A z)gnq7KgBN-!JGb6frVb7i=Qz+y|dks6_gmuC@bCk!Y00x*lWX|=)XXZTFRg{MvXV& z_TzJ&0e?wXt^-Xd?a{A1icvKk4vuweQ!SRaK9; zcyowNP10RyxML9o)<{xm@16Bf)x1%dzL{~sOZQp7Jjv|bR_iQA71lv%aSJqFD&nTO1V4KZo=Y0db*6@Uyp0F_)nq?R|;8X zki%#?UM5mdK7u_#)4ZR7BPZ@1e^|gmC@NH4_I{F}J5Nmge`sS0c4WKW4%>^y$Brk0 z(k3D_6^n}vLLZ43K+jvTTpCmUIwbOglCh=W;l(X0lN6++fMnZEW!_S(Dgvbz2&K+{{d}fPdpWpapQ#5$+^c<{9?Im3QC2N;hYN8o_)f&2P}u**!0F4+={1O)J2FJ=24-5PL=I1 z@(BK5y5dF>(U&fr?Q6QF95Gu|Ej4sB>wp6NylpeWa(U^$m|zYQ&^=MTERsZ@&5T>j z>u-qU=&g51Y<&Aw7imZPArMaiF;&-3#(*dLJ@`&Qu`d4v8^5XUgD*~j2_ zOXjvr#?tXbCKG?h&b$X8V$UQy(^J2JZP{-8Nbknd#pQHxIy-AJ?~%l=Ww~;M^0sW5 zMq0;d6I?)6bILq>l(%oay^}^CZLLVbRqzAew|W%*AB`+cNYPqoi{wK$@Q5PX;h`urdUuWpt%~DMP<<#Bq^3i3( z-|aHeQT+Df(l?e%5fGsnD}{h#M)RsM!ArxlBS8;*7BPaGL%0eT5RR9MTNet)m1^O* zl3MN{>(W9JVIg!w=0azlI2M)Ylhd4q=L?j5CFXhhu^U8qUoKQ!JHD}(&+^{IBe%BG z8mEigkuy8TB-hh<=d@dx+bNSf1G3Cn6yWz^!fk_#_Jj$(*QYcRgxEia^Q6(t#EJE+m z2w`($+WP>fkaU=F2Wo`$B_%EA#SDXoOqgYzgBiau+a4zthJLEKr_P72M@8xz=4G=| z)U54(4Zrf4c2l%)a88J%Fyki$1qvkyH1M{m#{M&72}0AeH4J-1@4n8kZ-BC!S5r=Q zW0tHdzAR$clb8Aw+ekIiMTCy`RyHVEFh_v@VaW>o$DZMLUFYt@AaTi&p<%QJ|4Y zb8=lv{{GvP&{C3+_Ao~|CQ`>Nh7Ou9N>X{nzmY#bC}Sz`^V%FYSFgt@jmTX5F^2ch z-Wqm27j#OVeHU%K&qS^!ghUR z6DR#`N(GC1TLKjw4_8=iw0KM<7tQ>*o#B6%t&n{m7#_4pOVe`qLe5FovZFe=b5z0Nhq{r1Rn%1RxCH#nmEwj zW!4dgF`b$WqdH7>mB@Z{6Eb8GcTF`%iLVx2lAzt8lJ_wE$g&i0pm}Ev!(7mj(j$4(Y%rw<=%q$)$ z)b@7dS!VNXH_s~CPND?FGH3`(b0UHM1&|Q$RzCJ$sdQ(fcw-~HWj@p6`D293cu{4; z9?EZ~dK(KJS4`l&-8UKa9NCIP*tLqwAzA*M- z$%NALQOD~>OqCz;i?T(O6wB(en1v#TY#PbUq!$bEQ_p*hzrqoJDq~4#>wuFGC$?^i zVovCR65uCkX=B3=9Lt!FBP+IalfqJdG~)Ct@-O}cQRMXjcJ+h~MSdTq)Rc=+FvC%J z&>}e>leBR}hJvQbPh(?N5L(xkpo>oKA!AHZVf?%+G6m+d23%=*@m(k~IviZv=x-cy zJv9?-m*tV?^Ugo*Z)^{S*u2oU?|NMl-?uVeNoN?RttSE9*+sYskN!MGc6hAr-!TwZ z!RL5(ziOeOZQOTX^^AKBMP?+&5<-spsQLD*Bh~&? zpDAU2tIx2l;&pDEnI%36D?u50qJqkwMQ;~1>Wrc8h))2(csl_TWWT==HM^P_PyCa7VYGHSrZoc{N^9n(hX zTr95b>96gInw!=S80{%f@Dc!Y{w?&tK%|1w_v+uwcXrn_x96rIYnDBVGqyC7v%m%U~Vp3lZBn_r%SCl3zJ@)jxxS`qvn8HO18Mv@x ziv4QfeUfS0(<68b#^Y;kMWjf22GirgMWo~@)mfIctp11#iTDj=@ zCZLp-{6y%cL)4N5VMX&1P+;!8eyHu}qZYEY^KA>{*ZdJoL7-BT)#j0H^~hdun~=?o z%TJdqjZLRka%j9&tl@n5CNUSNR;cxC>J>gJJn4RK7|9tmoB7t>t1QSFc9j$%DJj68 z$pBQ@zvAD+;2~gW(IB6Z1|h|`1T}Ad{MR+l5xig@n(pB3-_UrG2POEy7&vVKeSUoX z1R-Kp^Cco&0Q0g&e1J7(i97eu5xDiOd9WWENLz3o2#PPBugZkrb>)Yf{wWW^k%@1g zUzM#Qcs+T4YsCNXW9Huycm(nq$6JJN2tlo357N}iZ?L0H@k3L<6NHxt#|g&|w`ls^ zK*~)QH1iFi?Gee{J0iGX^(QSNfq0Dn5`i0`Q@8uU+N0kr$VxtmPRAo8si1G2#cknU z*koJf{@w(M5>yOuy$XJ}EPa>E8D>VI^Z{8aY-UW#A7`N)d()E^J^h3L0{fd6ie63!A6)W8O^1>T*0YL2ZyTJcXv8qNP zKg>M5gh-0SQYb@p8ZCC(ptu@UdgTe3mmr>wo_1Mo1FLGA{9G3g*!rIhr;_r_Qh&)- zPpr}H$K3Zau|3kd6dCw2vfEe08e3msl&u1JlqBX0jlLnxx4x_K*eN-6Bp3R|msxkY zwtB4)`7s?&To%&y+)Y_{V*jCv>+3$=jPWO?lIWfI|44hsD9fI1-7_nz5|ym9Z9B8l zth8<0wr$(CZQHhOn|Ig$J@2{aoW9+oNB91eV~;h~jukU9BGzv{&x|=|E7$)12R9%w zPo0;Zx|KRdKUo5v;I=D2KXSXe5ApvUk_)UiGb@Y>I2MCI5!g z0T3PO|FG?!IoYgLVg50uT?UQWh=51IIS-VevSj(ZOKBCFVkTVybpa(vd`9(MPM4cA zd%95RArBWOL?Sj|IyP4{R2K(cE3IStbvNqyGa+cV_ykRyD`UiHH1+;1Imp}yL|75j zZwg*5p;0Wr_a66TM_amf;4Ll4F<}2b77?p74|%0)FyuAPX=b}6z1(;S1%H=`gI47#B8|2AA&*g)oi|W|w))8$`y$c9S2P(`O-*j4V;mj3@IAo02$R-bFwAX% zK$e+}VRmh!tP!h=>v_T50AI&zndGxh67<(Grq%G{itxJu)PIFxBQpMlz7{fQD|>SB zv-Mb4n8^ZX!52|u=g-|2`S>Es`S>NjI(Sw8jlwqQL!wqt@b03)*jgL2T!!D&ZAkJh zUdcUHbs}_SopV)#TB9)tJ27!%=fq^~Nh8(upO%LZ9!Rco|0^M*7PxUI^FzW>9&vhe z>a%1UANCB5zH9$$T6iQo3bwiq%(e?g82)gbW-K`2ZY_02g_4HOZXtG6z;8{%o~1q5Brt@OK14bMhy0$xQA z8MEU3>j;RsKMEqe5Q^y09lLO0lZGSr^@IWe)bWI=qOvmu4G&4H)W!Fph7b!?XsL<~ zXU*eS0e?VDvNprSoM47AVyPZX@*n)_NPBQI;4Hi$UT|l0_ zLP+A8iPCey0T$fbnYplx;@t~`KeNu~<4Ml0siAn_6t(;)oW2_KYB|}hELlRR8ju=@ zyL+Wv{ct?eH4rYU_c9Q_5c%zSk^WQajl1eE+Yzk~r>H34~6ovfA z#sK=m?+yc!;;QhFIL+ea5^P`PO_SpatKG@zB}gqP?W~e|g0ku{iwyr<5*N{QQfgCk zRaIRR`l9-_UMpWx>=kC7c$H z&>EyW=qj9scIIcH)~Gj}hh>3QCX7suHcb`EtJ3;-0{Pb9+s7e%Z!Agxm1mQRTM=zf z8&ND~!yFRO47e}UlxZss9mt(3Q zQe6KCh2ltp;gFwFmsW@Q=O?2Y@cAtXh1#sVaB|Ev@ZO=H_)h~{T2N=2Qb-2B+S(ZaiX zkOr6t+4y5SRo|nW-FlT{~j!YVh$F%+;5ree3Tx+(7bS@<*zTr&6! zStzs9Tc&*2^m#7eUJHDR!5)-_gEF~_b;&FCgj&+Byh@d#15)6g>IMmz%vn8iqv0?O zvv$mmi2P%f$8ljMoi;)5e|`>p6I7B^|WD2;g;3?Z||j*O>Dnt$zCro)x2@ zs(dCr_Hv0FX!(CNveFW;+s_az{^3Ld7_`w}?wh+Wa>DpDf_F*DP8N|TXsXUWxr)vc zi(G}y)ln=m(>pf>-@aDd?uwafIb`Y{FHcXG9!lF<7byvTz2WCihZ5Ek;1T{>Mfrux zBWymHyrHd!?88!h(^=4iTAi^uVHnPkv3xRKS$cVz5~osCRHUh-V6>E0$zXTb?zK6d z#%lH2A>-c|jgJWKQ$we8^!6Qpce5GJW^Yr9#na}&$8RQEuU=s$%Zc~sK|HI{CE)|* zVj2V^FF)FZsV_|fsyr6`7{`g%E&-}2aYjYLYaYFzF4&v~2#I(?RER#X7IQ z3Hh;oz{n`F(U=jwq@l#?a-acWf$M6AJyJtcos)G|amTiWqfRdD4h-|92g+)*lf^Z^ zqrI`!(c0D4#-W%ue3hW{=mu-3ijsrXv3OHiM$^UkcJ1U3>)e_4;W51uJKOI4kfu6apO?TpR#W&J|RcNE(}OP6?w?(uW?HpWlF zKr+bVD<%$hQ4(kRS(2t})NOc*IMQCeHND~EN=w6;ZJl)BoCSDaV#xX>a>qi(F;iU| z)zi6fE4pg??jb|ZiDWdMqZ09>l5mK&mBXz?1KIW%%Y%#{KEsT=f!S^K;_dbqQ{RL- zO-QeY%f-hGJ%_M`q_EEhj;)*q=_>XWe>Fc{UUbn=-TVu}eoH zS1D7oeXfY_QMgbcOYJ>dY6nM&posrPeRxYpXev6LZ=#^KZ@8fHtr8;_@#1CW^SjU6 zRjX;M72>ZOyav*tE}K@>i_0WD9V6k=j&*yl9R`25i3ZOnK1GL+cddAl6JNtRhG;zC zN?0NWtikCv<7;-)Lv(iNP0&ZYj9C87xKU;(QkN2upO`gz!aY7xFg~z~}J&_nuq$a={EYDXn;QCRIWQt2zDFO?3R9(qZ51_ zC_QJX!jTv8_;N+EyBJiCph;M|Gej{wZQzpAA6c~;-@suZ@HOD-WOE|g4y*oXPiDKs zs1~44$C`bPSC!pvz1MXuM^}JSpW0LH7<4r0n$ObV-6&`<6B^yIXwQ6d&MEWllV!$o zabC#Lw;>m-;^>sd6CxSvZHVwd9hEjUPV+#Mems8Ti?n&1yy<@Wrs!EBs6ftx7;WYQ z+d_~%+&da_#87m0NAQI4O--NHTz=fq;C`hZHJ2S*Lv|9gL1Gzb<4gMIn22_Ns~Z*LoWGCjj_1?hj**Fj zoWmT{3_-MUSey{aRyCMjp!)&ucVBkZIWKl<+q!U|&8zf1R0mjZ!fy^xF|?$?I3@vuiZLaNYQW#9}V6G z`x`)s3@<8Eb3XG#WN2F!siC5d_GB+Fj{&*BA&)C65UA;-Uq_@P_rsD1-eIm`XalL5 z_8Nmm6Sl?Bdiir9q6E)l88d+WRTiGq?H-E7r30ekjfDGN!eh_v9xjZMNF=^Xxq^eb zr{U$9Gqf25=*J4kXlAtRtnOQo!cx^F;zHQ=mG$yzZAxk2_ez~O(#D&DgoA;XZX+8P z1Cw@+Iqv;Ls_G{R@hvUY8&71*j1$tFoJ+KIsJ(EJ2x$m>96q=c{$hCnG<<=F9MGs0 zrsJWDpBx!m{;)en!SQ%PWK0fd8w87iaCLbq{kKs#+U~~ugbWVf16+1!rp*WbxL_n? z26jKxSxo zjZH$h42nkqwCl>ZI};`G(atHX!{an*N3VU*U6*EC%pLyYf0}jIj?#p(WQgr`uIETc zyYV~b2=12*-~Cz9%o7L!>88{B^Z4odY}uL^j#kHhjfs2C5h_S{gtP8S$MAUv&boDy zD^gqqhxOTRG%GFb6-Hwd>M2{06({$CMtH1zF2mQNmZ+{lR4krspmP;UTd|wv>taA) zYwdPk6skU1Oa9Q!fq4!l%Q~)RRBt1|=y48e@U-~TmN<%?Uh!qkXi_Q?d3mLiWRi5Z z!t{9?otb{r(`tFpuomsxar}62Z1gN{<*3K`;_U~o1-VTi*Y{;>aq?WmVmP5K?R`NH zW3fP5Gc)Cs`0;R{6SQH6m1x+7lnu$PHjfzwftcv@%z>j5SE>dW*Xi8dCp=kGWD*Ki z^I)d?o(7kg3$PIdxLcC~p#uF*)X zzu{mSg()?LBB6p%Q~aX^sgIu5vGqD&x-m6`2%}kgg{lHS*h75m!kH&JAdl>-bI;hH zf1ZYFuoc7}i@tHEIW>Lm%%3Ak1}i%rJM^gIo z8*LCgHw`1qz-VNRq-w*9tLgrB&~KsSt!(ZtYu){QXMP<{Px+Z^==UojA~kSb9*u#2 zZJri)L?&J+v=+_pNfK1;J+Kyvp9W+pE{~aSaf#~k@_3;UZit?c-c(e$-PAIUIQqiG z9Bw7AV+*MVhNOi3KX2rj@Zmuw;=-0vL3TRKQ(d=v_6QEUVf~1XuH!-0)%QJdjcmf= z`2@AE$Ur!oP^MUOw1vX5blmAms%7V$LTqJhI&^$`pSk>lg=tCAM3AsaDFwhF+%n*? zNTH@~51SHkt<|kGuo$d$N63C92#Rea!x9}JJF1aSbfT>08YM@^i|5Uz^w52$uMoeo zya55TB9}&udZrOYJR_2;U~>xU##zotmYde8tbHww@X~9aYr8Ck<})-68fR0{4h4E9 z2P2^;A$6yJ_aH#+=!j8vl>W0-OWt}wNTD&<<+l6z9_yM#`F-QMHb0yqW12~?82Tz) zV&yDa`H|-bN8cQLS#92K!a?O2O)qfv4d+yvsl%hK8gBb?nkf|}kgH*JKZ*>r5O!BH z-R0CTA1xPGi%0qXbARjon~0xIxbJ>c%q#bTH?EmNKuzZFdDY5~Dbkc~^By58d~zux z#IVMgLRTuO9kVh(M!R7VFrAlV<>}AHhvFZuafAH`W0Nw$kg1cBnio`LWYMOh>{cA7 z4&;Obz1IwbbXXp2Zgix_<5-?#eF+`i>#R?=xn8kD$7q(Pt|RFvOT0-+LE2Z8Ie0N);eYIxlG}jQGLw^tZ?3-`L8@SJNQgNC#l zZI^+!{PEb3aG0=$@G5#Thj#xM9*_GT(x-akvdeE0*c-V3Ny` z)nGBFEDSRQIe36SurpPDYaqR5XOdwM7Zz12IR#}R8W1<+>X!wN0HcbeFO`al7U9@7 z5nKjln<};!K+XiRZRL|$DO#W)z)3L21U{3%rwe%00nB7k2~)q8#nSuGSrImLce6Gh z6fL6r%~je4TBQ1Q3=H^MF#X!kwJAq4=M8>o#NePuL8jqRpU)^rsg*PNm- z&nT-(Z11Hs)S%J~2}6(QUKRj*^2%`N3kti%MVO6bb@k&vQVh0FJ2NwiX?deI%V|5O z)&#DpaE-6q8!c~hSZ-!9S$j2Qq1)hkzx!T<_%|9r+ZI+`&*%G&^e#ppIHG_Oi*I`8 z0TnYpB9MdnSZyDAHRi+VW*&(Qk?J+FT-=+w<_s!I>MyW{Rb4X_NpFZcY3vuQyOl7HNEc-)ggScD*ST1FYtdt zdL}C<^eDoa;%b+{0sLM3cSzn)5HA`^vdypv?@OQ)i(Pj$=A_b83A@C|(Al^k^8Ux5 zEIvOLjoW10iA?u7CRhsRLKTWsTF~_#cXB4)>Ao+LQaTKJ@Ue@?uoszjoyJvew*!{t^-=R^5 zBx~0+b3w=6ra=D3F&j!aFyh4}u$yuab&LifF-PKl+*Shg! zSJomM_3S13N``B*sz+#KT1*#oOm?42^P_lyGrMU)K>U!3*}+9lrM*OSzJ*Q*Jena) zK{9Hld~&rO7EYzg$s$ld|J--V-J(bqk5A(8;``TqWs|8NAs?ng*yKq~^P3nnXlpff zVmE5DMxh(UpiZ3|j}c>Seht{5H~Fih!pueAn(>`N_*}&F7`5}^0~x^UMonz+Bx_Pc zgMU}MRn73K2OI8lwAl$Y)$y@CGxG@{g1hM3eb+vix9axZzh1X8&~RqA1be>VFLCHm z({#JN0Qs~Oz0z~hv(oc{h>k&gDMf`V7ezz$B>&p_M^k1F&Kdb)0A;Sp3g$lkEsS^H zg|g9qA|?>QeLxzY$z|+%dtklqB`@goNmC$5L|`Qe#YAVNo5^a#imI#i#o9!-9f8xU zr3rkEFMli+4>ge1qUo}TfMa>SBsF(eIn|b!(TS7IQ?q~_Ku(AoyHRo8 z76aY`47AD2gS4@ry>`76LWAqGjY7SpxlHsXMJe#UIbGC*Qm8?+On2fG#W5E{!eTUZ z0ZO;^#dQYL8NUWqgsY`r%>Mh$_O>{~I-WD!JnoW(;!sibeUFRImx>k_T>5bX^ct^Q z4W>A^4c#2$lkH~|-lmH1A6vPSRm?~cvVOEUPp}>1vo|9y!H%icIGTgTT{n{Fh4J$f za*gCz9jn1#`SwrB8&*<~d{xUG%(Nh&{y?LhYd~E0hjbs;LnK{qoIH%wattWRR~dtp zTX4=a)Q_Rxb-~sGyCl7jF7)$XWaIFzxhR_B>3WgT!qMaKaqbpi+!#9H{&g!DAafSY znl~J+7l`eQem9#MCCp#!%gmTSK<3|<({3WXsZaq=;RvMN_HFbN=6k$Hoc5YEK>rJ^ zZ8gXO+^Fr1%d_&$`vSD$e0dn6Tk;3#o1%|J-#4IcX73KPE%0UEZ@xeVU_gy&**o7l z+>C&h?8~|vcL2v2V03SWTm3Na0pis*m>SKogk5W)0otxOScmo8pJTtmS#Gcj6&U%2 zYbi+-y47p;_b>!+C(!J3pl-+S@gE!CN&hK2tV!{&pC^550|T@Y@M%}{2I!mDprs$3 zU;$SHKF$^Yv;ZUf{0bXzHQ<|T)o+0EujVW~D_fl2wOs_#$1RMcwmWO0FcBg-0@Q%Q zp;zQQD>|eQ3w0n%G_QZe$H{@T#{eC0`7PdKsBd-=yMw*u+VoQYyPc3TZGe{J?LbAq z0>cm+#7g~e10A1ELzdIWqy0Bnhv97gA3&Ru-nD(w@y!4MX6%^QonppPgV@5xfq>{zG#?deVG~E z`(BoV`ih1`#pmHAyKk$zD~3d(U$@38TS*72t26+%vRip4FBWD)FHi+R_6F+(e^k+A zf^L@GV5>@P_%fI+4Q;Ag7u@QzNPH>3CQ{jYv+Czz+WN$0u&ADb=^)+5?7go6dvqyz zQBhB3Aak`&OA4%@A@!$3TQ3Mxi`*SIaa>w<#q0iZ43cv-c{ChPO}e>W_KBD1yGAC} zSn}-cMQVlYqhG|d2Udcw#vdN{l179= zyX{L5$nxa-+)klAHzb`1qyRGvtu*YCWuBLgt#8Cjl2=M_TZ%FLNul6@miu`tHY`|q zOEtI_)L%y+c^G<|YAbjEkvo;H5;=Q+<4N-`M^>2o#JNi^>?F(bxrm|apCKgt!t2L% zf~nI6f@Y~c@=DJO^#u|rg=Zz`LlP> z1?K`hlVsqr0;$25O*~-Nb>a_CdRuRW$FuTtSOz-XtxM`uK|HkhcKr4m0)zYa#GB>S z^P1G_94EfrxT|MbxE}feS=)6@nj{A6i4Rzz0jTrG=WWN}st#R%!w9EMe8nzhHFY+i z?Q$!NdK*^{Ub^6A>MtAnS1Lnku#?lrCm zF6*G|4VWKJ+~lAq@hU3#Wb`^B(shvICRKUr!55Wf4H;yhndIg_VYC=%UsMP1^2~gT$>B{ z5nHFOQ-RcqN<3r_cqkh+-WdDr5s`Cz#wsiJm`ktROmXP!?97cdAt_-sHiO+8ntAG! zk8VyCSJdH9`_YU_2Q<`B34ykm#2Qv%xh1qc8Hjn@vPD~%(Lb(gV5i+lM-<-jkn7g_ zmw>WT8C-r?bW$M@1--mkR3^gIerde}+7nw@GAdUxAAsf zPjWF`^p-=xW~zBiE+^r-`tEsbwVM6pP#=k!kio}fYVxF(ljYR&)5wC6)%Hxrxjsl^ zddo5B#*Re-eHqL0XNa7FB2N~paZmIy8`ym*zH~3?04{ORVD8L{aq(Fvl_=F!%hT!O zZP89Urj;OU{hU~kq7ezY%5jZpC{M@L`^nnWQKII=Mi%$x74l1}fy-9PK=3+OM%z3d zc>SI4E$`HPTuK078^Hj!UeI}C)hiG6aeTKzhqBRi#&Nd1I&Pfs^(Gas`vcM>OF0dl zGV0af=iC{{NKDC+qFGf69|>(Hj7>)wdU$8?8zp}HPf-EwNwhGwTj{fH@5o$}Z?`d9Lg4O(Zj zm&+B&AW6M?r}VZq#yPoNoRb{1z)Q-ll;h$CRda*OPchh}$_tut6%zi|`W5&c{!2p{ z?ec)Zn)qZ1%qo`Zhyg`2&1$>R7z#5^L9rBRIKmtOpknkm_f zMBH!KFTiADO9;~X5J5xonpAKUcO8+(m~^LM$JT)YCBfw^rgXYMpP97fazCd9CEb~G zzo}V$=w$Tt>)9%+SB$!agCg0g`v*kT5+*9pV#q!g8)X(>%a^JiY|JX+!IR$}FbyPl z(2=>((+gPGH`(Rhn1lOHYCZm5p8sE|4N`CEiPl!^Q`ErB=qws(^tDN9tCus||?>?6N~Y>$>En zhL}5jH{StE!X}Exh7sF{^R}IzIWY?TCMu=$L^G9Xc909eBT-r!%D43`4~GzX8^a-P zW<`%kJw}-&(kT=Uiyt3$G}IA|r&I}SVg-tF+h!KU1(}eLQbRBesg#kS-^2ZRb(EpV8ad}24ZE`m zt29~i+^1C2*4KiXc6Xp8eX7Nj=wfo@^(Xy%OQ&7!`IXZyU&yPXE$_;LaMydvsD&{> zVMiG6G>3Bjm3LuJpb=aR2Q2F9?d-)5u=F#idp>8HV6kI5b-z8Q{6gS&`Dn;V8*V>nW@VHEE|86=P92or=f$6dj zI@~+6u+){Tv=2{d5Y`55yq2-dl%3&y4KvuG7re}xcWux$s14tOCgfG{Hj{zi&q|}qL++5&QI4r6yFR~IW%VU=mEsKuP z&pS|69qolrwqt&bg{IP8ivCIIQlG=*cnxLoH*=f`)aHj|N>e<@hgIYFUnsut@cH=C zj}DG+o@dK`m0dyTyqs&-pSf#tJUz23mY+eOIn9DTu=2JOGX=;^~8mD(m!(7II zLN#?wQKjD}=ryuq!KWwaErTKZo3PBS8s4(}_eV35w8UYS`Brv|0C#@~jp-vjP0Q+F z%bq;S&0_7JKD!yRYW?ce@@A-nQwj=JtNFXLsfCQs=r!j)dVK(KV8y9gx%IKgdGC&T z_v9uXFqsGMW-^CZqJy)yr?KDI{uq#J=)B2Mzv#X=ctd$hyAX`<4>LKpW(ZHhRMCkT zQa+3hK5!8yK1`wSbQkiLk^OfNbwVrri0Fw8UjlCi5`%$rQjX!_k+??xSEsniO?&Of1$Few>e=ZMaQGk$IH)~2b4-7gO zn>XzALkEv~=3h}?R<%WPNWyL~+2;LLyxTkfvxvKtozeX3ba3Gt5=D8`@B(&Ad$sNR zwr3qL#eOZmSTM~NoPSWWfW)8d^E0GA$gz3%gFdxmBN)1S*Or0QE)559#664Z5SW-| zz$V3eq8c)u6O7(z^()Efva3sawN!VPr7F!h$NF!-R=wWOj^57lZPzuo*V?b5q2fe3-ga9QH=#I{KGG08I z+MpE;H!2k*lS?z&AX*0&K8CKdR9MN>ZuuDO18MWEgbu|T)nrHQyE}45U%uUPXyQcV zKYd7QpBOIzjWG~%W&TU~sx@GUI>Z2J95g=TcpL!{JMX+Eq83bq{J049>Ez9#!Hr$c zcg*HMZ52$Yx4x-b6vnU=#-P-d2+Jm_)+taHZyQAq>lI+MzW)6nF;F`s96lC&3di)|cCI#11VF9SW%n+KsnYtaB$hTZedc}W>d`S{w_fjOJz_-=*(?N#nA zE^*IcU#QZ|iN$&nuGV{7$IO<9TbXWwGkHc4icKfmgB4bW zHhlVmjMCeEBm=y)phBBZ&sX1qDwYT1ikJNSlP=r1FZOlidd%DT`>U1#@8V)BRHKnR z2*waJ8WkT&3#&yJFFJZa7*;vK!wQWWTCJOr2xDB_ib%dJB2)Gu!6C<4dT6P$j4kx<0PtAy$BV9xU-H|yF(yA$h&C9ehKoLBU$_3u|vZC z?DPpWP#QuW%T%15pyWinKIC=f4`?&fGL#ngxV?Z%y7Gm|7%HT}0H}O z9oE>n+(AeTq*8Vup|&ozZH8#O!Ip*yCWphnwDagE<$}s5J;er z<|v&djelA!l7VvF^w%Cu-@POlRcf5a9EIKfSX>+t$}l7g8iMAQv7hLkTVa?e#(~YH zgB&ON6Wa|pqX33tG<600AxetBWwbi4;}&EJ!>x%?4t{TsShI&2Su0dHnnM9QJ|%%~ zC*8Y-$RgRP3F)`hF}b@nr1?X5|o`~ZYy&?0Biuh%I(RjZj2zru&yjmx{&YC6Aqu-Sab)`LG^SMQI{?)WeO>& zg#48tDBVWZgwqY-Nv%C-TY#sH-qL{q1 zma1dQq=&McIs{Iw^oU*nu|BRcNZmIB61F>mfFk6w3g!lILj*Z>7-j_bsm zn6cjWXGLx>^8!SLa>+6Aqz1Hys+3uLpIuk{O$@1BFT9{c0{_HB5$CBtS9P!5>Uje% z4O`CVyK-2K1CQ@viWr!L^+%AG^hqughar}a$?w~n^BdLq@IA&%v(v%6wvLDfRsNJo z8{_-Ou`w`-Vnfy~=1=#-Q<=63S)&qC1&AH~Nd*>lH#!fS;e17i15mrQlMq<0pK^}t z^4GADk69UC*6-7r9W|x3UxyDbZ4-Yw74188_p2v{mJB0*gIBS)F5U4}v7Wx)s>X28 zlM`3M#AN?7=Nq7qvqL;%VL9#hE8w(Pt@y?GI#bC*Nh3W7RrUFtNM%)0Vp72}7E-3< zeT_%FL5_(RYSA>SY7vk&!Qz#cv+ZCAYLE#AW$&YrdP)In?@S5_B}YIH4Min- zbu-w*qOFchxDVYdKW0;%?KG%Xd`@U>qDM5oxOg1XTSJF%@Qd;ASO=t7EBPsh;*)kl z&kC6(G!7t_JzBQ3vPg`8S#4Q%VTY^=lM8ydL?&ntYKO@rDb>&j0ZN>B0gR`Q69DwOl>s6%Eto%L;u~O-$U3HQ_-*n+<5&AUE2CgSeD1LBFd9< z-!~IGedWWmv%i!tvAQh*3&B8zt9Hb;5W$b)@2 z$40p}HS;8C3Do?|O98UGgz?L;pj_xz3xG%_*I+q!u+WmN$n@@jrx2J1=; zb4BI3$zJomz3Wb^4{dk0J(0f!0qhtU0F0|QfDF8zfJQ&5qsMke#gNWArd}6;YV=iG z)PZ;UU;Yy2U;jS{b6R%o8`Kq54@HJ|Gq0BPInqBRAhqMVM;LR}rg)18&&as{ZyOE)O zLH>ih2k-lE+y-E-C3icTmnmR^vHlNN{YBl4-v8iuMW2qn&A&Ka_uIe7`6hC;#c#k0 zL0;{&4v;a?@=*TmSU}axHQ+{QuyaR3%*t@AmR~&JLW2`=0@V5)OoIM^TmUivWfR^O zNMSE|EcS^HmH#dJ*4_9Q`M04I)a=Y}lmsZ*9i;{=H+UBZmrivwcT~Gt=8Bc+=P2o1 zH5W(Ir%JYcnuKSGK~SxetMnqG{z3qdcKAP`Qi`YCIJ^2erG>EY0Zguqr`%j-&r1N@ z=x%CVAY|$NJ%qf~86Q_qsl#))1=-@G zxZzumLLZL?q_2WiB2@`9T`kcYumU4|tgz-0SfesGuR9yDAdbX3&G!?Y^2Uzo}# zdi1=ea+_y6IgRa0;P!C(N9NfW%i&U?)dZ#~1NgKVk?hB(rcr@ER!V5}v#bTl?Cjzh zEc{2!&(&LArnfs8Re}xd$!(vz@a8&xISW%ZgqSn{ePlJZ6 zfM6ZkdOQw}6L-qr@WBr^E(S6GNDT^$IZix43@lMpIa zt@-^e`u6mU$k?0Auh-w}Lh>{e9xRW#_ZI?+`XXkhK{XpXY8)G->gX&YXcio0m9JX7 zN@Pzy((>*&xEAtYniO*O&Q~L9PAAfpIUJ`RM(ZLx7~LA-J{*AEhW_}B+o*oJXsU(K zT~WmliOYPWtD#8XWEE2rR%tro5q5}Z^YUV(VYOw&yFq2fyU_=CimpUwBl8(AWyaGW zc1&wtX@`v|QOszg;=Y#P4A^6A+0JS12E9p<_?rgkPg-<_GR2PUG$**;HbA5yQGO6y zc5evDn7D$Jm%-fDag(Y^_KnktSC~Q1)tABZ%fL(-$*edVQ*(-~wX5g9vy;&=zFax3D-gVUx|LhE<%8wG!-JX zsVIL9deW3_R3o+yg0PS}Z%nW9LKX>0p9pk}Cb10^NjG5J5m0oRK7Q%8xTFWZkk{4V zPuGfvve`6UzYbS?IvD~68&su^oJ5c;-Xzo|g=?VxaHUhzEyH)%C1De^lN2(|C=u@; zj#1pj1i@_yNjqEgtaA9iPX|7FNTR?s5dI~@<>(Bz#+ym}&BLxyVnw9f#=a?=G_$RQ)qfPQE%4aKWx#1f8HdBk^V&qZn@TbLkd?ejG^HeNaAW>zfrj4NQ7s+4eV2k6gF=26X zwXwBTGc&O-%*n%tPYl~-q`BDV)EKz$UJltsWu>!*KtLu6hkGbduWO~bJzLi=tvF*> zcyk!+4aZ2E(&2b9yXjb6pAvYV zA-z5LcBPABl?iyU{%qr<6GZfnCvodkwG+vJSBHATIHClOv6Ee7ePTYV^S|UHBr#AvpOrAQ7Eq@ z+x_U_B|&kTrq*g#Iv}f@P2VWKu99w<^qN&if`av`{o+^CVNgI+@H(1#2a8iq^7zJy~iirtSW8s?mMfMvb{-4s~2h?$77_shO%a9ixiP^A3Hw6mVej~%VcE&D& zxu-j`e2%xRXvAVjl2MXs$w)6$q(ouF`E>&8v)>a-(W&9Ld5vu8J!TV=Nh0!FKh&H zwRc!U)HIcum?mY`E$W#oB?B+tBi*;imzR;VGFVr0XN2mL%l~A_x9YI)8{^ zC(N$e>;2^%SG_+j2RS2Vcd%^dpFMiMPyx^=l{C~a4e{3mqQ%l@84JuxL)#ZgN`q@- zr==DS3yTm1Q*wY)rIV1`1FWiw?f#KAx!W!isnQ_D0NY~eUC~hEurA9V+Alxhu)b(t z+<%*J%~=>ui`;2N>s!k`=VflxlEINM{L~OSpqI#scDsd?OcKfU!vds+E-(xB5Xj`f5e5m`7G^X&x z_6(xpyeAUE+M(2Ex`S<7C_Xt&zARMP+{K}#E${qgXncT3uH&qT%d-AEv3}PFEUc*P zgGMXvIH3sT>b@kJGuC9`2$}m>?ip-q_(Yluh3{eX87)?>xJBL(wPoHx%Zz_e;K_FG zV_^8#CDRhnT%ZXUmUhGYLyCvwo@GQkBA4+-7BKKH>R`(%P!?DCjXuvzdrND;pUM(^YAZ0iWdH-T7Ji&tw{) zaPPodIQxWC>)Cnw`JUVQCtZ^7^%kGgqdXn&sbL4+&B(hY^*GZ18(%Uid%?5y}GvWafwbxy7AL=FU%E0f9$gd&}S@vI- z!q}1nL_kZ`BCLxw18tr{PqC`YPEI=lDOWmdDl=|oFPkmcMZ83MaTD-bMurdqzt>zyOVz zpH6f6&rE_v>|b3!2X6x&5WweA9onfmtBg6dlDZ`UPD+^G*}ekOVH+6#QTHlM3+1X1 zhT-aCd%vv7jl?#Yqepm4sp-SMv=6D|9bxgQ8?fGGqv^8L?VNpUzlFaHB#cwZ5#t+tu| z@}#(!8M)NuY~=MYx;U+p^Rm(#Hg3!L=Jn*2C&st$vC2{$`lRoW^v9B!-%{ChtJiIx zTCosL4XRA6z)RS|=pMX!T9j5|u$3JT7VN*c5{hUajO1r zfB+$`JpWg!r(;xlP~DbA*1iapRj>$umL~wMGMu~dfPod zc2=aGvkdQ^qIY;=x;Eu*eXv<~5`^QL0yw5#1mylxt^MlxCS~Do;vk8u({)5|t{f!+ zTZ^&{C8guZ593m{DyA+0%u)lB9&GgFzls0pWvn}x?K_tLY}m~;Q8UgbfZ%xaYYU7J zaYoV@K^`>If!vJ3KmNx&Y~_GwblXgzm(b;L_`YxKlM&%kj%h{J54KbtBlGCi$IKiz z0nSsTFZlRm@=NJ}%hBxRGn+Z#_rD?&tPRfKS~`q3zKX6$OvFII;~Mw{1$acFgw%`} zY(x;-!p43N9!%HxKr`liN|CabLcA;(gF-hsBcrfXUCds_9Cy-%Gk%9_MC4Sp! z=y`@x=D>|3_uILobI(8o6)Y|L=pmdONlxWBU}o-DTy0mTjH9}qn$^5xdyaHbJQ&&G zTRwwppnC`}ffC4@P-E@U<9Y>L1!MKM%JH7Od9yeaR|(>Ra(O(8g?TM^xHMocA&GY| zsr=sznh2r+-7>?WrEMHdT9O&Xkx)yKgptaQiR~V@s~<;pVl-A9${DR)Y@A;s6GJ$X z6IgVCgVib5$xp{|((@2d&6*f3nz6trw}eap?1J6nf4 z2Vnif|3^!}Jm3Ge1aMmZ+Y(?E_-{*qBHsUP$RG)IME5fy@^&jdXLwE$ zgen&z^?$q&J#eXj zw(b~+peeECm<>u}Y@(&rF5%Uj`+z$K77-yEJh5$^o*y*wIM=K@xKL3tqi-!Y8|>i( z3*jT!Z6;fT4GOI2#z|NqR^@raON>3BC~++EnA~l%{wRuBf%Oo}FL*0ln#7`n zj$?J%xPDJ9ioqGq?{;`G@CV+_2PFM|dkkl_$gjEX4H$fZvxpg!Gpy|UVE%TUnmtd5 z1fE~Za{hm^3Y-o6V->K;`d$A+y$V``CgpB-m5@!H3zR@qA<4Z{)sd8DG_EOPMD~7- z;~e!{O>J5Hh7g1lLEBWE=^NJ#X zFy~Yz5O4xx-?Q+p7#6nQ%BT*cJA>-6y!*U8X7g)oG(cfrv`72D7546Ik$4q~ecr$2 z3uSfL&FRZNq+oN6geT{V&jKA>34#c8ukS-g@!}NX0@x}UGuQS_<8B9r`_Z8U$l6=y zENw0kY?M_}q^XB+Y1mP3+AOfVa-e~<_Gev{(E&o>C#{2=+) z;F9@gD>YMk{PkYJ{Q?l=>xzIC zsbPFEDzxLPUn4*UVVYg#z*~nDekv=N=GVE599GNlUmXGXan6+YxrVqsEX;Ib^UgY^ zHzPNnf?<6-m@Te5)TW^DR)Kd>fvslHj%5uG%OycmL#qjAq}j<8=cySfSvVJ4Mpgfd zw6_e4Gf3KniQ(=}2=4A0+({q=cMI-=4iJL7y99^egS)#+f({ZK26z94WOuLk-QDl} zIOpdK!}C;kS65fvRdu)1=PTV7-luyLS2j6tPh|DDc|qiC(^{hh<7c|`?3$X*+u_|S zAso}*0BZT(P7d=!Z_EPU2I!nsqNHa%*&F56mKN06p8q<(2S3yat~mVHCITC<6F#1` znAIs zA2+9=@puF{SV@c+OItYWdlZU-2Z&>atV5GsbJFSWwCr z!%j`~RDNz8_%vx(PFC9lcV0(0Be=3JI>z{!Pe`hou*~7)y~(qJ#fV|dCj3IBc#leP z`|f-P9(wX%K8#@DLc8+Oef1^Lo;LMw;vb%_Z)c}34PX~SF5mp11srIH)=zGg;1?2Q zC+QxK?5hH#)O8hx4)dp!^d+`T+YQan`?2xY11kQlA>jM=O{9^vLZXBvzuQIEH#{e_ z?I_Y8E1no6uAK~){Ep6Mre-I-=Lc!8gf?S4if9}H0}rQZ?8ti?xLg~W6^MoFM!D)y zl_3hN zBx(SxJuZ}Os`HRBD~7uU7I3c^xtXprNNe{jxAU21BDIly3SELleVHP>CQ63!=j8gg zMgYy2vh&Zwm_MR@QT}8lU?9Y?SCo&1c3$1)2e~VE@(@^GR~RU!K3BGp5-HfoCt%AH zd{fmjjwsqmH-Ja5hdS1lE@(+ZY>Gy)n0GfC+L(a*w5k+tfP@_U=DF_Npnu{--RD5{ z^69>|!t^2B9}H7D-C4KhtBWM9y&`hvfP7T_^4)PO*1e_KrE>!FNOPsD4!lZ}XX#;m z;hXHM9X+Dtm#>VT(-tsuY?M@#kJCKuyVaK=N8V`7FANI5Jwxt<7Hu;o8dt#2qP)ZP-Z-&J5mCq_vjMLhR$z}NtTbQ}Y|CVlm0bn8^$Ud!U zubgV$ZMI)C173AR!Y)DymVC>g2y81x<(pSMFQ04dE4zyxJEOdY9`)OA)qZ(;RuaJg znE$p6;QV>_-!#GVyZb91dqkw~M%wR?AX*(`Z~p7!&MNPZ`-M%P?DQWjAC-Lq!O#KI z88kCJXBJ+@Lph}&GQv00c6X%@ovx3>&A9*ZS5A@JT_0(vUf&I=BYK~b0$#xwNc$et zK_38v^haV<_uB)JGn5*Uo9ZKj*_SW^FRkmJ?{LugJ4KrLYx$-BvFzF^Up zJ=N!F^wu?$BR{U^PLW?sqCcLSKOL0lU!c^ad0!htH7f$NS?fB?;nm*((1yOl_YJLp zLXOPIpxnc@csirX2L1nK3Iy=hL@Hqt+#wsH)24};{PHe3zbRCyue2)`1_459)%}H+ zGy?fuf6^K?IRaujMIYw-FGq{;e6u-aXz8!jQNCeM|6npZ9DmBN`~G0}w4wY8Y5E$) z%pB+Z7I2FTV+%)IcMo_Qvf+}6Da))BcwNH1d};L0g#x3|(GgU*(j++xJlc;>*bP=& zok0i*DKMH*0wva#2Yav5PEVi-TsL-wVLQ%d-O@b&c)_H3aKpvJZQ7~}UucrQgk$MS zunOpl7{9!PInHp2VAGTl?0tQ7Y6|pxO8Z6`ZBv$O4bPqcOV$>gZ(S?#>{^!voJ|Wo zp|MXK=I_CYh~d68UBMUWiTCmcirt>%Ob8mp-z>{|%r|mZrR& z+|*ZaIL0!zl0v*#vHl$(oxnrv`80NaIy5xZ-RRV6N}Oliia2_ca>vC=B6><2&B5V zX$9-*CYJ307fFQYYXM0iYevXvmi+OE4rVg5t3aHteu3{Cgql-QPE1~At7;*b0gF$Z zD=HS*-(g<@Y2^MQ`A2Q%9`u&_tPPQvT;jj0-+#EikTD4RA-Et0&|rh#m*Rv+O&R&Y zMlpU1d@^DpelEhB3|7g_Ns7MI>+-o-nDzSQ-8;a(ga11@o@5Di6`&FHy6zA7kB3QM zsuo|D6#v<0>f#Pf!I+z#>fVB>Zt*#-$=EDCui8L3e_nHjhIC0Zntspeqb-{=HB{pc z$k=&Ev#kNeeaY!n%NoknU`Z7E{{gg7zUAXwj52}wej3p+ejw1MK4es?m!I}Rhzmmn zR^E5cErX_FRe+}BH*jILi+eIVFZ6?^$;(MT4_7hO3j!2g)-Jc*38qU6<0gN zbY6DFZGOYJ6F0bO5&cC8xAMt7NuS-3sVTz7vNs7re+0=R%@4Mz4H~(ZL0fa}HC_gO z&nY^MrrM!JNWrEiZi!K!GVS9Jy^^qy`;s!B@+p5Q&AoW8orUbra&|p0r^^X$t{@1% z$AyCMbx=#$5NWLxMgr@uAl+agr2XkKD|86wQcwQFe3;Mubgi9_z`8l*NL$ANjBSvM z%)nZFUGR=<%y4eS^OlPN6_ul|vt-RYnQ3{-#AV=WME*6@!~X@p{l@SIzl{f?@u^aq zf5CxJs4wYfvar&(_;A!XB62-yT>b;Pbpnd3QhIFe_6h*$O`=S+E*g8$Zm}O7xE%T8 z#{)i)aC--CU|TXLkVr9eF(ukAgEO-ZM9>>JN=gc7-jz)C`n@9oKY_66RF^Ev%g(Ph zgL8`{`5wKdepS9v-{xB&WVgW+L*!OF*G~_|%B#fwfg#KkkM20~v8AGJ4&vUM+RsPWa zxIrXrW%u+r-l9HV0y)iUx!M?STh|WeaS&)A={TqaM;D(z1eIo0G>Nnq*g<|XTmu6+Bw5nCFpk13SALj*Vo zt8gXQF?U@jV`Wa*eqH^du>HImJ>wmWE38n3gAV?^23t-Nx^U1{cGflI9&P2?EJg8# z;D+T%;Ity@*U=LfwUZwq&Wi?;oD6r7qospm4_RXeL31l_9`f(ee}90HDOE+Vlrgf5!3l>AGsv%RraZ>vS$}P{GrE183caef-&c@EK)HDHil^KE`Xy&f zInVi!R&s7MEpk9}-d^;i``iXGYolOxOr4`Nh@?g$%`lLz zUdZ6T4v@|SdXAL87qL}7o_Ceg^Uvk%fzW0HTLID`D%bcjW_z%RXI=VMi=j;?eept; z5%1{9y-?GJil6Rg+YhnMeUL`Tu{M@mpM=cxUvq_i$6p0>G!{G$mQdE%2{j_|X?=R( zC$0xQ{&S&7RTWV@cu^vj!+j~HYG_5+$=k7}W2{fmVHwplNP7MVWpPe{n*t^ymf$0% z3Sp00V-#4cO{7SXYK(OZW^^Ei&#W?y=0E8%Tr}8Tzo*a98invhhQj#Ie8mt1i-!jGwK1T{VepkJ%Cq5J3U|Y!EIzwh#sjIh%-UHX<_H$8;rIw zDg*Ekq5SXLm%sUFuputT9N{dYSce|_%@U18*XlmU%zuF@x<{rpwd~!RTzP25{I8I)*L(zzY%T?>nWauPSUcE11(p#eWt|7ANWIwaghT9FYm z3%@Z^_`La`J^b0I&UK#MU9I#s?NyE5i(7?L?oq* z>Po@CmuP-hg4nZlBH!x)SYf5fWh7@9X!8FPpTRMODHh}rWZeSf!gWV?kxdao+!^)U z)_~Ot$QHGPuszxA37Ct9ahfDh^x>6-{sHWGUo}I z%>f}l%q9$&-z&QWVYjh~jH4$@E~0Z|xP1OPH@BOH*4*%kh@V-1!9)&#$|V#NpSgnV zjGa!ig_66a!p5g39g<0YGOtm1{Q7^eAmpNxLD|;cu>%Oeq)yK)2we)$p2oi@N049+ z%aC{muAiElMA^q=%+U0}r}NgL7*>r95qB0Z{Z#-=eRmq%qRn&9cjBLR|KM`htFI%< z>Lh3B4!-s2U1aT7KHd?uq_B$J`cJHae9!uQyw&;7sO-+xIEi15T|%66Vw$h_4V3XC z8=WJL+5me0=AdV1h*2=X)71)+GSc(lwC74t}HlsO| zLeLpa*&*R&V8?%Sb3vx- z`d)DR`+8%sE8Vv3`YWgD?q|bL&((4K|HD|wfIMY?q=rk$@(SqqpZD2{IyBX}o1|$leIn>~&646EH&F++x=~`}#+a_z0^r^4X^({eYXO?Cy+yzz`NdEo3 zRTo)lJ~xjJ(!ypx6T7)fbV+SO_-p)C-&LQdE|JC=SA3$qVA{au+-0!3Zpa6hegNU-og4}~?eO&lvQzpqv1=(jiFn$P&dy{UJ&otq*3}NrEqu1Z=|c5`mz8;m z5FG(T_)6)YA^O%3V@Xs8#uUn0=Af>Fj$m05{4ys;ZAMApK;bB3aXCex-gP0eekH|w z+jhm%hr_k5?o5D&W>|JC79F>^<;?Bz#ddZ2)pq*$O^g1v)AF_xecGjtw|$E&-#o{4 zD`{JBpD`befY*x^D^bumeC_5)Gf~QsdL@=U5k|!0n%R~RlfckDiyp|QGEt4$+-hoG zk$>xstF$cS(uLoM-ImnBdYc;6CP@)6kQ+#2M=JaTtrx`UozIt?r$P*|kV)0uS?G;e zvECsQ%ug6!dgY)L&yHu~Z85(!jaHxvnyy6(U|7R|eIWR{%H43X&(38!`B7GE6Ogd5 zlh@6G$)&w6=}cmPD;IMo2n@Ubu|3tUeIKjqo$009zuF2+i_72(zvL&mqA&v>G$igW zN&=bslWI{(S!6^XxAN=t7TbFd{iUo>71Q_W9rrrC(UR!~$5LjZF_Y3i`XPHr@^J-u zNJ*ty*7VuNk&u~l90`OVl3-jNmUnUkZFue7y{Ii?S*?4RgIw(DVD#!rvL<<*#Y^b4k4d9Kh zW3hUzh1U-r-5 zTX*@^{f0h9RgRwHlbs=7v$N}LsBol@ZH3>pmDWBijXuVNv>^osMj%>?`JIz*-AubU z6ySMWBj7YosC2t3UtL&F(O_o0dqFB9OwTS{zA^Cdc<4xe%ky#t^5rHZfg~f)p?g50 zBHLBo^v5QjOT(f4)6ZO-pPtPuU?`%#zAEfwZB$ymxtFkY8AlU%NW44usm{F8^^3`D zV0>{cLwMTfYFD?Ka^E?I0S3;-ZsUv8zBp;PBZ6||TAqzCh1y9vOY{BOTp|k>)tTtY5UNnbnRo{$vx-_{v6KJsO2V#FSYP*FHu_J}v z2!_11VfY>GCRWx`#J=#!FkA+l$2@b&6iEYORa}Y3Boo(`qaU&y9QYB9!((nqpHFAS zA(xgge=K~;xyY_Z-mX)M)?A(|PBl}j+NMjaAQs`826ylGizhKBz-I2vq{J_2;~504 zRpK-f@`h+^E?kOuWakiY{5L5FY|~8|gJt#ayAXoLs^)Bklq~HD`>pfigj7K|te~YC z6i+G0LkZQR+V^>&5jLB#ahp=171wzrs@+csqc8@8pQnO&0(Ts@R$XxZqpZ zZlI^D3=mnDcNn)p7V~23HJvRpjabZwxl-oEeCD#Sq#@(ey}0#Kr2wMl&uVo{V~~aJ zIIExeKXdGFRf@)kN5&Ag^LwqdI5sSFyvr44lWAin62V1``UAhBhjqLfh)6%Gx|KNHZ5pH8)O@iw zyCt!4t?FZFV)nO)&;j1BZ*%MRRa})`iir8)u?b2pCa?8S7pqxK=?=%^PI0CbU>{5d zPdH}~l2}z#jL=PP*nC-WHT~W3dH6sGr|4vxMbFl1CBB4diu)pifW(d&&#-ug#22ef z#M$iJEUCCUgU|aWTN0#-O1Jf@*4W9mh4EwCT?M z$_nY0!znc;G~qBc;zMzKe-AEY5jBskZ=MeZ3gWAc+xChaOS>& zM!a0ySv5N%B2T)P0dJkIrtf`5LQIw=@m3dyKtG(v2r4Ft`Oy_1wLl6z%N&1~CC(T% zfdcGoYhZ6zFvAAU>#4IRkFsv| zBuQqOGCN94Fm@X6teUl;KBp{xUM$JUkf%}va=Cggx4r7DE9%N}aTusJ=;ay8vy$(e{|)7Ll9B83)3SQZ4$QZ#N5=hmW;LhczA z5?Et zoE%}h>tqLC?#Hxd_wD6TM>yN%Nu|NX0I`FuVtP(3D`4%gNsB{MJavc$8mh%-a4(!R z5r^BmNVkWS$Ifqj*vfnd*|vB?8%t}S#@I>x(r120OvzNsu#<fyioNEgSZGqnwyfawE0Dvr za)6HK#$$ZjiXu>w+}1m#I!UmErn@Iy@iQTS9OG##VEaHK2Rk1hWDeKg1s=XVk6I|_lQ~32}Lyp8g8npN}5uyVx)BCA=x4I-{+F`2ibfZjztmX#+*&lR=i7l4v>c0YhcY+4*@9Vf%;Hu-T&w!R1sY3eE{q!gULN z-|wq1dZ644n?qRu{W@Dih|4P=USwj@7Vj1IFvf}m)qL#du;Yya%Ed+`%P7)1b7Z^T3K7z_l#)nGmH&$W zRIA(iQ-i)zKHvXevq|5uv)85d-k(3eMwpIV5nVs#V-qUMt%OP=$W5{2oi5d&?Pt@4 z2B%OJR4-D=V!AuQ%%+opV}YOa?45>4)W6+0<{C-pv0xc<99vdnfsq3d^D3y!l<)jDvcl+O1L`olGUt;gtO z$Ip(iIBHxQ+t%yvuF5eKcm}bPlzr1KzQK_4=2wZ-xv&C6_#9!e8AEQRb@&;;qLEME z2~{R$XzZ?Ew$1vQWSKcrjiAwM1`Jx~$85=QmXkPH|B}I{yPJ^ON~j$P%8Laz46M8K zhY3n;K!CHH6F7Z!DgtYTn3?{aOsOz?K- zr+EUo7^hs=L3mr@&3+Ub?o@G1V;34~>)-maK+@3jhsc}`7N-h^reB{wNQGpiPj zP+@^zHt0dQuGDl*TJk#7`gLl$HB`Fw9DKM}8Yv*`vhiHTfZ#gIG=mQ}8-DNkx_-nx zhzB`k@X}#m#K^u$1Jt>GCx_4(y|A4EZ)yM<5;LrlFhEu*cr>BKg3enTbu%;gA&m8x zOFwO>9Dc`tS+t5S+-or9HN)63be?4|3z$(XV3u^^lt}-g7D+GgYspJbYTrd%Suyg*=;KnSA=x9%=uf4_EC6y&JBXeyyG0qnQ8lz;gc;n{>3ad`YY z{}No=*c*`Aw>+K8&CvIO($GF`p9KZ^^5-Xlc6yc6r1&ogS(|;c8D#jLM+${~m(Ahl z(RE=ogOlGca!c3*d4UFD4mJ^8@z|(fHs{}rG-kQVp<`)TsC=TBbStUZtjsGIzVH)My?dwiQ7eD2k{SD39ON=3_z5;R>j$Vc6371Tz9208P;LpmBwBm%M@g57WcmvfjwD$u^V+!mJ3B zC^>V*nR%JZsPK=RWWU(^={2-X$542TLVi4MOfp=-1qKQb4*iJK%+fjID5=XL-X(JX zf=_H+!ZPK$h*p7-vY&Pv?ht2ujjrNtWa=sXH2OGs2gDmcT8d@hRy?zBFk)6V3d29b zkd?Bh@XPx#CiJQvB^S#aZp^kUc5T*?`pUgVys_kf{qUpi3h?0YYk|%^;ob}mp)PjQ z)(L|1=sJVC0O8rF^f&53g%(hYXQgXT!-w;WDy9amJokA;X=yv|FDD<_P|;W{nq`bw znIjcBce{3@$S*XxKYkp#FA7wX6y&0`_wPN;k;@)*m3uw7&n~C^Gk;N4#XhECspdLI zmp?OSFZODay2G4*&F;bEs?2XEK&CK1uY)0^ z^-O%W`RdniTn{vH3M$L-%r*~WWv0ifZ;kKv_N7* zc*Y#Rl1&OpRdnJZGdNRZDAIlA2aVzv7pnMezBKsJ5MSc~JZsY3>3q!Xsx9`Vp>+&){s`0$AyHzQ@2=rWOj%P|Dp7V;B2yX#;6Om3zIgydhH6Y-CSBBI)cK{ zYvoNX?{}g}R_VN8Ze52p4pbIul_J_Qp6@4Dl+_ScuNTUkZ|7goM8g}aSq!Gs6=CMc zZdGmZ5`P8dd5nkbc?E&HZ9fkVQc8bk@dS&sHg{0dn=zB<>0$2wIEc$Bez#Tlt5}{s zce_A(ZFBZ$K{cy{v)7IHTdPw4LvYGAu~TuiBFc7!DTAQ9rtwp2*e_SVLVG5ks5Oa_ z({MJ=-Wx8kbl?%7G>)Gu`|i54;9zB+hnQA@hVSTEG;XM9zSxBNN^u)7<&KM;F+_`D z*FAZBVhYsz(mxp!bkoPNR||S@>*&>nj%F#DN&ezxuv^5jG9hw?-ZXO;RyTLZEV(W- z4MjJe+ZBCZK+~&5I4`UB610W9f z9eUNI?}G4)wUkKcbu7`W+{y~(mhy-QK``{f$5r&0Xhq2ydykr<&9_HBj@p5h!d@tB zE?OTX*`KcRC4KHX(a_u6_E9=HH4iCkTUJGwJV+PsPCob;1*V92=}(Pmay^^{&J1 zZTS<>%ON_%Igw#tf(*ps;wutc12<*Ej4)K0-fE?5Fl9!yd^X^7b@U4^UdySR`@)Um zFllW{8K*IXI?T*kUg78&cpxOqRTFkxfAdp5~eQ~Y=&_*g3j|w@EGMOiYiPs z*Uat+Dw#6o+j%Cp6S|p@N0Lk$wDGtAkWjFDDLTq4 zm=1EcPV;_<%%zqdYn77V3Zs{qbAmatOM^TT%|Q8ptFq8fi8>ZSl^jix6P=R-zc(~G zsnkdCNHq}fCQ;xZC;%@U-+J~ki!D*y9-3(JMH-PGJS3rwLc6S5+`*`+m3}%iD<@+U z;cIJZy=4*TYPI3^Kw6*Iu`}AzJdJ@l_W!yoC~;%hi39KBHHmE~77tlr?lJZ3#71PF zjwM-F2qvpy6jR~cU(wgLuG&aqNHX+!8vmX2Nl9VcSOQ_b9k{MG+;%&Ajd{kqaaOQzrT*|EKur8On{$u7i{La^)&Wqo?_bsu%7eTf1dLGW(ISGtqiJM!}jw4^${s#SG_8!MQ$j zGedR9gOnvpgVh;aEaK{eHGCG7q%W$VBBd1ofv&BCu$+m2E7!YPCeOSk@$cDjHW^>Y zP|x3)B}+vIQUrlP&1fy^1rpVdqh9-d69Vpc&@pZCok@f4BnI+;Kq~!+jSTJKu=DE4 zY1>1+-+L|6NpaH-SR3Kd6U6RrdQHbO?m~JX4zYmT_2l?|!$?!}*MU2h@nm4yyHe%l zw@9Fod8|KLk=&KWJgCPA-^(3&r%mIL5f6E4aV*xIsug8n+%+e)!$5ksbYW~jfPPt} zZb*c2@^B!g+AxqbtncdmB84RVd%NHh#7hhvm&^%ynA{O zwML?zBC!EC2@PsAMN;5mGuHIy%kIt%6mALaJo#+6I0>rr$ac35NpD+7SBf1|KG`hKu{JIG-1**Hmz0_l6uV)8Tsv)o$(=B$$p z2L#2VG?O=Kc%^L7+C2B@N>|DByvcdkvFEQT$av&!rUwQG_9i_usvbc zT5;i6`B(U7D_@ul7Yhc{)biiqtv5xXQ70lyBG~!WT`GZd+)aX`sB}+z)dmmyH@Rvy zA5RkjEvcJG)ex9f%;dVXZ?RzZB(L#ta5=np>J4eKKoq*|P{Ytf<OTY-{Y|7(jSRe1l-w{}LPP{Clv1!ExidI}cj+3S)~ePR8-*ny*q zz&KSAf^iFYny^rZtWuLJr3pG85AmnLlMRu(_5u=&^o)hqOmO=B(ip)+0_9TdNI)zyoGL(H^sN1fddBsZi?O%g6b zUUYHMe9q$=L9T2G3_I@VkHFW5^1;JsB&)}gbO*7-WtJoGu$=D1fpzYSq`T^)LQl42 z+;(_k!x{R#7O0pc9uu9`e`&-ErI?ss5(zcXxLb#6vXrX4;9=qP$^oTqxP-+sJ zLHKuqu$-LaKxYz$PmLQvJ{-*b<)J2_0oM0Mk?=>J70zY_#N&X&y_NR+ocusLJmxPH zEe*TKp|oa?CZ8%c@8sG&A8?F*h_h3qwCg=K^+KRq5@;Kn~_|)LQ+}f+$lV4?*1;e*T>5tCQiOiU81xK zpA~z9H@-J=FPQ7;g5G1_@1!3u)AfM+72B&u!^)X6u&Q!I`6*?26;vA5@st&)F{n7A zf4CRLp1zbX;&?I13IjvzH`u^OHNV2qzHf2kZ>eOmlZ7kvl$I|)L?IUKqZ~1x`?1?wj99Zo}NW@^NVgy(g%VBWwU053euT!6_9-FYbd>Azqs$WM)3_NxZ zvl#ICY^+O-h)UX;?1(hATg-=@3^3+u;%`$j>tt>Lbuv$^K-XO6kEi$5N^Rj#5m?D! z28HGSx*o|MX{xb8bg37$ngnD{9t0A@^>L&MQe?&^AAFW(Z0Uu#Q*GSgeUG7TM=&Zi z3VUOu_If_y)mIflbTuG#&yn($CmQlbTY#RL0Np&>W#ucTD{lOD&8D7OHzKGnLW3L) zseb)D*+th-59y@IX3wkH{)KrerGQ@|nO|81l;J6pX)_Mae~t}j@X^;}-eoF(8jbDM zao1Hfj(oNCx*q+zUtZP61dJCneZgKq*a%`z?)h{xr0Y+2YhmD0wVrfyR)IL{?y6+>%K6Pfju2*HKi2#Qzk)@-$CvB$;Y)%J&e%v(d!lE z9pn3FkAr@z4Vs#opHqoiVRCEg3h9W|OoYHsid_ncxXOSa&}z1(JDsWV~l8Lm00PSWeEd;8O@oHe1fYQtr?P1vm$JGssD1~G@q zYDFs~|8aU)q(;8!KGmY!%E${_&ovdn|SRqm{uypdLfFFsvp zGlZlRX3)u9_P?1-cwSpQQD|!ut7~W8GG0wAIA=^m=l%!PBBRVDjO+MOxU7$ECCts$ z2+<{rVpCt6>2QeI92?zWWQWt4C@QKqi;NRQ(#r>M*^b%kHs4=traI z#}wLmCb9cY26@JLGilJ%NlJi*WqL0BQ9sUbm=y1oi3hSzu8VgL1Lm0!HvN@@FyOAdmcy|7hk>=Oy zOb7h|l)ipDExgG4LpTw)?TdU4>;=?65v&%>VB~M|a8I{tNSvA8+iu|yj1dcgPuEa- z6(7&~`+aT1jCLR_CO&!9n}nMx^1~j=S^I1#asQ`$t%_~8#yg1}j*En~HvfWA_50VG zDO3Rpu=M@8r&`rRi`EtivMG9r_lJfb-ADIw#1fN$Leppz^aUnK>|8@lSDHOm5n6g? z!thN-+)5pjl%tIF)m@MAwM!t?9Fvuk0t-WzZlYmEQ*#;69Rbg~jO@L#gshZY#pCQt z_^f+-w%D8deRq*ubS(h6SApm$QM~;8RHM$kBE0rH0_P-6c5RO5Ouo}5Fg$#uwU>;7B(w4Fstf!o>h&r+EvjL z@nm&Oe8H6-_?-tu8wv{ZD<|7?#XsN7VLMzMr}m6aVH-%ul4Y4(og*Shrm<{LmZ~rA zI;Q3k^u9}4*>0YcxojO)AlvFu<{OVT@i`ufZD-UtK2TLQBw|xqx5YUfX}*T8lWm|Mgp+JJ{R12_*f%@3-d>+JN?|^;_2Ir4|w8+QyQrspFkv0rMvAyfgb| zq!6YR;9kaBRT@tP8Vd1pVmF5e#w{XPs8y&Hcfc!gY@RvcJ59^9%P5)eulP|j6tV&!P5Qb|SVPagV{t2g9#-uy+% zt(jzbBH8c#qIh);57ksbmTdb%dKM9}BH8Ifg>e}~PR*`kwtP0+?7V zE8`FnPj%UsiMI?1{5TvJri(8*kom+SR6?hdj?;rWEOiG=f_Ft+(u0vcx zt|Jxc=P?3DvpzgPT_tt3L3nWBy{IPTT?j4n)biQF&Pqd?Ee_-TZc4zmkh(>h3JCy` zgJb)2v2>Q`=VR|#CX~UYOOhrBYM!YYHEqo4+LCyonfy)?v)66lm|?N-?$kz29UxPA zfb}Vd0eXhJwTzGr9%7NlU0x)3amBjYGOFyg-QE;Z(VLWj!L5EO zzY}(Gdqe1bL4BN!=>#<%KT~-vyu;XaE!n#%bUsb|7#WIKMVOD#9PBMaOqsxw7o+kl zVXybCrydxO8cq0Viff^;29D21w^%G43cfg7g+J4pGU{#tu4Bs8g{4T%?vO`g*P78{ z>nLG|CD9Ho#H7TLZm>S~sJ^AMRx64p#%1BuiP4ye#T~!krcPO)l1I_SsiCJN#~nska6B0OE;9US zf;d7m0TK`VHYT=z)6_DA6z5T>^6Cra-QAYOX`&)RVx(@f5Xxe(48W2jJXXk-E78f* zfVIllHIJ=ohUG>WRiMta>rq{J7{bq;V1focl=lMgs`7j;eKQ5{)xxbW*JMjTt&SxS{I=fgS4jyXtbFa0fCVgfy zabK`2RLUVl6C(IZ-bA=5%`+stAICG`SLuqg^vBbpU1#d4ed8aw6lSDY!{X(WI zHgG&{{7Vtm7AmQG#$)!lloo74k=eOkyQJq!GNKvBw$swHWte)fg;mMb2&-zNhaSw( z&c_9mC|+FC(CicC_YHXOsT6@^l~>&xZya$1u&&!O4+Uci_#(}%3&>Qu0SE=K=q-NH zSy2@0t=*h*`z6LZ45lf)?#Tgl2S%^qOE@CpEWgm5f4p9>7b%UGwuhJ%LID@!F!2|96sO?s(jt^w2LZZFbd9PS> zr=RI**6exA3HZCDnRG2;8bpL3VS-s7N5)32jd7SiKCUsT3?R_QwEl4V8{4i`(Y8O- zWAv}^&Uy^HJRU5=75h<1P*U9_#gf9w?`L;^DNo_)_%fV%g28q%plUd%KAtuTY+505Ybr*m_24HfRg(vv!aew{m(VXV|FHPvS zVI8zZ41Z54P-U!bG%td5nY%kjw4eX<&>{=)Nv{cW7Mr{&ATw$6Q? zn3aKmZ(POM4MfOOh`PwIT=c$N1e$v_91Pn}J0y~&nG`~ZoN-gf)ctNACiUOkt&S&Un5ZYO&;muQQQC~xsRU{X zE@Lykc+D_vHX|eik*%LkC;%=v zUf#_chSCb8N$9?8M6o0p|6grq9T!K_?Rlbv1VV6k3+@gfxVt;S-5DH`;2s9|;KAM9 z8C-(9Ll|^$-66^IJh|_^_ubw5*{y$|yQjOWPgS3)KK1)n8MVv<2NBlF2TMPz&O9{p zBBVRcx|leY!0R#9ZGDDsw>0kY!sX15yLOpF`bpFWl<)W--SP9cOZ2G&s9CbNQ9q(N z+uXl@#OIl$QSbpNyamrRs;Vnlxvk*wzy++H$#~gQ7J??MG^5qw_Qdvk5qxm&1H62t-EmqWWyjJeP(F6bDxWiL8Zp7hn&79d#>ZkL64yZu z$K1TA2m6n0uSRaDwpMP`utC;H&j+5KfUfxfFh&-@WyLvd%K@6moi30k3Ev`O}jR4c=?k)%s# zD|ygTpJlR>G#6L$7GZVLQdY^=rPvPA`noFa$WL|s`Nu8%FN%?6th@}~ehqiDHM1Mk znkrAv%rY0xyd4gu4-kQm`P7g5O!`%}ox5eqpxyv5#dTJ>mhx5c?!^BtY7MlT_2}X# zZCe8Rk&jOgktjE~I5Zj?XI<$Q#&6<8#=i<9T?=MR1BkzhY}uIS*frtM0)j(X)!qF? zWvqv#W#h6zQJI2_eCu&)d<i^iqRuD=W<0mHE+GO6q4< zw+Erx(?GoiN?|{`57A&vqu|Hy*nwE-5>(c#C75eSq)_#_I>ox(V^zkfL)0?PQyDQp zqJrbt$QuO?>TLVtw8O&@Z7sek=9rB>mV@=h(h<*(Y` z(YZSN`RI!E8hA+BKsPKScnBhDjyfS!-0aCHpzuCPTC>P5{}~n@F`{vH@~*BA1hFp> znCMG{l7ya1FMX|g!>K!0o$GZ?gIx>_A8k$As6?YP(Mq}+7P1JpKg3_2%=6xt9;&m< zjm!3IWXIXW7;PqToh?e|e2i_;y?OrYoxIs(eW&(gOUoV?Y z$g^}FhaQp2g z=iaB!7oIlud(@6O{J^{JRTvK_e$(kd8=JDCDo0|`NsDUm>93-fD_`rexbL%Wx|Ik& z_;JNdW4BHx4se#G|CDnIj~(x|J2|)#3lCYBe(&qn-&_$V+Fh*6>z$EJ1FA-?# zn%RdOIU>KY8=w&uxC@uM9dgVDlGsr(_^-Elx@sCH_V)8Pyrp#voPyRlpo)>P{a0p* zK=j$nm3=fqbSif0)1rjgSzivK51*{k^yJMFtGlMxwXuR$YC8m?gq|BMeXaSj!rrIu z6V#aITT8T6K+K04xw(WDM_;+!a;~GUU~@M)#@Ez1&4Dv`y?MFSta*6iEK(O?=Ly;c z7?YaEpb67hP9>Y}*r?}>BqH>yB8M%tFk(sGTC!#vigLYo@?q(#Ht>FnC@A4svrO3_ zoBg^>fMTxfo~Rvx`WhN7IOq=~0)T_@jvX>SiWW!>6Xb*l76{}nmTgrU=KB9tT$<&> zqTnoKm;uf=yjKL96RHwROhvIS_sU5@>o%!6rB0W@&V!0mxr;6+yVHEv>1Ntup?vf% zIrCaReoOJHVwHl%cg@K74JBz@vf-CaYCM4+Q%GRD7sG>V&LJbyNzia3isBJr49=q3 z+0m-%-IBxb+_M3xV4GC0D`*cSi5V}AKl?>!!tNVwIB1A=?HTDcG)&8V$V+HN_9U{` zC8p7P=J?)Y|8j}9Wjh2zx4vxs^heDImK{jqdB!Y~HvZ0LkP~>3JvMy?o%ZUcD^4`7 z(OUk-<@vye4VT`i$K0YOR$Vjg{0|Akxm} zCsfkOO(v-56Q22#lZl5*WQF ze@Cevz{-yZe*|%%+ibs2-Ux~TS3s9#hS@|!`p&0s3_S!B|1)3;BlXxlCHxwR`Qh}| zp8?GOv66*h=>>)nMz0ZWJ3#MUdyJ8>v1B{koY`-23qw?`8*PXyl0xyVh#p`?oTR<$ z3}=g$4qm90=P4;SLzg>bG2DMoHf;_S`OU7vGNrTIMBt#;+t<$-#^Jdf4bKG z{^@|=1IE|qu^Heru=~ss-`cU>JsFdfHB(an~rX-$0HZ7tfWhBC1_VN4d3{{upY!;n1b*BvlcEm>LP_Z?*WooK| zjI*0A2=`afH9Xbo51$owqLmz*OvB3u2|xFiaXbYvyH|N6eb$-@Plv<}TNe&QQ42FO zzwkIH1+eKDcdW=;UbHj1nQ7;o26diQNSWjdg&;uh5;fkSWiJJ7e^q&?wBt&@2pR4;sWU zvV@COY~NSw!KK!d9V_9{VJA?wwaxHOL$??*@X66e?jrBF&E!Uv!Ar|SRt|&)L!!YI z&sB{a*~DXMS3p$>>gs`_TjZ9#1A}XJS&=)M%uGx#H2VD2-wJP1?uFHW=;!Q=T1S#4 zRvq`srgnPi6{w=RMBfnsZ{0m;A>~OC$yQP#G8t+bZeS6g$^FnnNIeDoLUu%*nZqmK zkiSd~;+$0RFeY6pQhOCoUfTyY$-(7c?};qmN?xI6RiQM)zbre6j&l z-gNeb%XHL!FwB@5X~<@pI8Nr$a<0AqF&g}%X(4VOL94;eHjOibQDw^hRKnpJgd*r1 z?r2Fh$2`r=Qf?vG_k9+vTe@I|n@2vAN({##A|K`utEfWlRzU_PkeB9w80EG*aX2*_}NjvB2PR z4W@D`!>+-ELfooj86@9^m?n## zTRG?sPr&-OwQ0{e_{IW8o!C$nK<}6{5!^aP8X8)IhRmLxn5DXT3#-UZ9+&c5+g9#>fX5-$E6&6LYs z#2ReXj`P0<7jn#w7aUcQfZ_)_zB$z7~6{ zn7K>g2x%pxQoeF3rYEi#&ta2l(8)n4hRW9wua~Uz-f&B_6GnlF`BkZ#R0+7)7u8p4pvvgJJdIA6;aq8~bdk33=Lzc{j@iLR zAw!;35KB>~%x+L}MCs|@6!rpbU6z;TnT~n^_6;0CYzi^51 zM~*27K1$`oy{07L<7x366S2%@Aeq`&GuQwMhhI%eZWraIL^6k^b!WrgvQzUK7e@V#q&Q&Mj6n^V`V;Yo^w z=PE+M59~Z!Dt#g;yaFiPWrH_YIIv7HrT9fl=THhevy5QFA2{kWVO+8^NykQ`Z+tr+OE#JV1g-VE z?WdUyGn0=xvY|lfpiY(uww0YC68}YGKN^kYb;w)nw|^8m4%~IC$fh5SBPh<7W)c=h z9V+~1$r-&wKD$F0xHVIZ1AlXFL#RU57t6r<{F&4_z|_yAaE(%S#%tX6+gKfj&x?ll zL6g&JrXDKp(@I1?ApQ|p0ZwZzbxF?q3pCEln|OQCjoNR&Tc_p=WLAk53=WS-cjM$r zngIh(m%kWKXnWXJGWt-g22Q2z5b(qc9$9|J{{cvs8VZuxpcyCX6{lT%8^#hsiUNEq z>{I^@Ra@*+8pSv}S@>0BaDde`?GM_L z4=2LGO&$2{ij7@Bg)4&tGU}MJxZQDO*4D<=@w)IerjF8#4vm4@#VI-iiSxP;X` z8^w@QYZ)slB}^Tp#3VUSqM-v{J&HO-AUhswAt9k0R2!>>g|Z5fxES9g183g9U^pjQ zhb-5*#djv~k2lFJn`{d?$FX>mSwv8WCmdGBsIR1N`p0!z|lAf_GCg*e*{wv~-6J#|ov5)$CHr}qA3 zQvHcS#8B!&O-#8YboClBz^7y<6W)R_jdJeuE6P(tIIcMsyUlI37%KimbPDOH7`%o9 zUv8G6Krn5DtZZP_7XdBPSX2e}16$+pfvr&v7>qf;cI62IT()P~YUu@UAg;SYIRh6v z>`=!smiei@f7Z@$-CSB+d2T{8EcV>ZkMP27vww#dGShurrQxQZG4YB`nHTs6D8zjL3V*wKENwW5kA%tx zCQY-fI^-~m9^52WWRbpim65JSv=E{^Lw34jmxUwZ2qaGTr7AdaFna)LcWgDhY^6#( z8W9ssYNX3 zoACq6y~GcQDelLRJtkz;Ssup{tD;_jE(?@UKH%XZ2`3}!UaAQ)qL6KWgNhr^0H)Ba zllm{ILJF?`Ko#2kK^3x4{7DruBtoge+^kehR81#=Rsos^^1Q-rb;cKx;k#3LQh zimmY~FG)%}c+)hHV>BOE8Bkbv*%&&x>z|s4xm)y%f~g=sr%5@<&->bMlV)5D@MFl> z_==P}%nx%6Xngs;yFRCdG;7O& zh&of|qr+5@P+BneNKrx)*IOcpq>y8l+by%AOrU5q8qDQ-0=(?<7S}kPf%VMQfH)|u zD*w2-@`0u2tvqcb9!zhzZA#JLt;hD^lKhPD_H)Ki>Po?&lZLR4%H-9;b-+HrO2XE< zkjM$r{ZiBhz*^EzIf{)Ti#g-3Y4o{$OP(9%KM;ewo={@2`R3mfgTntCV$g!)e?Sbf z`~NF3n49&B7)D6!FhP3s7KrF`vWxkvz>i_M&rXwu1mDd3nz@wFbq}q=5L35QYS6v zZ~f&QOjlQ@-TejG?9RTMB#4wNIh3=b?fino0fiNFo#Ljkn>U}c)VD>MpMF0JlM#>whLR=x#gs_rAgBRI1} zE8|tXTUs|!vEt(#V?Q2&PT`@Vn{`lq-u8bE0)iHJn20Hqo%XS6tuRwKxNQLzG4L(1 z%yq+=PB6vQ{k5V_p668!u!;6Z7T*+Ap}p*f`BqXnKGQ*$Y0P9?@?bFq4s=rYH^91! zhQ1QkC7AoHDVP|y;OKZ_?1N5#wsv?3tPUZ4zP36o6h)VOhpCWego2hm5Mi#S+^Hz| zSX7OMJ|8uar&#DqBVA^tvUWW$*)xowe(4bU*=z-Mg440sjFaff?2#}YvmkiQ*PJy% zG!A#Jm1-H5_0!&a0?IjxKK@Pm5BOQiv!BT4JPD|3V0gy8A`?5sZEK?vzw6yMLz9T3 z-CR$1mfHM38y;KIBTjBv0=(o}hO@=X^xXw_3%gfM0qI9*RVK2!O=Y>0`(;li)N>-i z4}D~*^5GFvl+>!N*Ar8+9|)mynL}j-;Y7Nnu355i63IP@{k8^u=LAh>Uu$X_#Q4t! zplgS1t+dpyN&y9H?UG>OEN0HLm=UPWzwLJISmf~&({rP6p_*c1Aah}i z6c9FRT4{sMl@C-0{HjxcRyfjjHDwL^9NK(eQ=n@h=WEfgGKQNyU19Z({Bxt=S?!Al_&%cV!> ztrAo2qdi!h_-C+|{L?Sq5E{3I(Su4Lq3jg{+%GT^Dh-B#8Grm!A1eMU&;Nbw^srL` z@XC5W)#1^DO#f$EhKB~u;QpU&+A%z)LfrP6AXDoowLW91#E#jAcpCdi2C@{LLI-)X~o)v z4vW8z?t#6YwmNw+JDYj$$~+YjpN9LFf{+cT$?wRrn4OXN!IBTDRrvoGJofYQ$sg{- z0BJ80DoaY%3nCjGEL#XbC_o5*xqA_kFaeLsiD}`XeHbD6NWV%U&e01q z=54;k_G4mkji$XUXlDzeK^A7zzgD})dnGEWA8psWWa(;Y`@&jdf!en!ooF}8?v|nl zSRi}{Ro4H^Gt9?=fhVA$!xHeMryB#gXIM=WF8dm#%!O^^S4FA(O}M|sDYnQlHr){& z7Q9L~!p=$z(BY9^7g#3#&-#lM>5<9BJWZAe_@lBc$>v(BncLb%|LS?&#j$YJ3Xc!5 z59B8_*~VNF&LBP7s|qG4D=1io%#k5->mS#?yNH=uXzX~cJ;_(7v&R2r;cZkLSSKAU z9j2ZZ9(PwuEz@z{WsUrx&i|P{G7mrpHCMW#MF_ZbPD~qJENRE58W-3(Pos{K{cX#? zVV;8|00&P~j&s>h(r{&UC=gmPi2mVR8A_ld`-r;ayxJ(%I_skp4Rsgt5xzE1$3GZ( zIATMJr5bu!DX9^7L%Y>oRQA@L32HFvZ;`C4=)q<0AC&w*Q}PFV34rEJ$MEajZi&Zx z2J@qFDyL`EoXrKh!=;TK667;^f8KM6%>4`1ZADVTt{`QGeh%WF#jRP+d~>RuokkF- zKkEhOME=Kn#?V4`O(XEnO&|S56a31<|JCLP6|#nB85y2Tgw?3OA0h|ZRon5MR`|Uc z4|P_#DEgAW4Xqap4M58T(mpJH0Zkt%9|JwPi2nPN9iXV<-_C=ObddLtQ<iM6<*S!JQ%`H;M>lkR@!pd1m(^gT zB74YYnkEA?5b>$qSX5lbMdXjIw7$6pl;lWMKc=4C_FHde5v(vtD{hFH~9iq0UQ44t$_ii3N7)B zH*acHLKxO^7cI!mkyd$c<14Da>I(}&!AXj>E7@=|)sP#kpRFb|UmvlS8O8rl&`Cii zg?PH)2*NQOgYC>0L)?$ebwXO%OVk&V(Yz}Xwt8X~o0BtGs4NZiq#VCdVs@*x$leRP zb3k==UT6#TX_^z&HRWX&Q`aOup`7v{FKWSEi&?)oCHrb=;3_mD_v( zh*IdudR;HlTX>-|eecQiAgwY8813OPwYy@F|*+*wX{p=^(&_dHteN>Vk7=F8vZuei=A0f48^VYwPP$`D=a zGO$Q!-rQ>j<)wvgvG~q))w*|C_uiYi&&rt?5|ZfMK2nyoxZ69P5UG=*omptA(3E($ z)PcyNicF=~f0>i#DFKpE?c?Upz1cy4wnI@<;!k+&vj6Z2$J1oL9kGE%{mN7$N1f&*p0PSYHp@t*vu66Gwy<14RZ)tLOH(!Nc;~3HvV0%M|%kq@; zOW-IOwmvE`VFn?gBHCNnA~hs=!3nmo;N-_2*x{(2f`xMfl7<|+U)@CjxSF;J#&8{# zbbxdSGS#Qtkh8dBALc}E{<1Q%W!DVue=^EbCqi{bsXnP^UC0YGk=zs6S1HsqgzfMGo^yK^fTjKHq ziZVs$aYE6{pr73V7UG`{vtHz3&IlOCuwH1d6lNPc@}apNscIBHbJJB-t?8#remH#C z+$apV&Ze+vv7~-g<3VAij|ScQUSpBCLE4&Q)^m_xNhd-o?{L(Q$T;P@IP3A{vbQRXKKYMjWbFuw-g z$rEwt&zILo%1sC-YNVg$UahaLr-J}yGH|>u@PM6PE8KbAKkQoiOS<*l>;g6 z!#qUKc-e{7xs6vt)>1vJ9=fn;<)5cR221F0nO;1LoExXYl3u+$kH*Id`!+0s+xYj|IbqK0{_MQo<~$m@XK^}Iqoys_1Tnv-A6 z?>Z?{NGeQ}-MKT%lJt+#Du)f6u;s|?S1UY02=j2!jhwXwcR5p*9J^FN4f#=4t}UJG zy6qUbjL_V%9=Q{8Kz$@b-}6~}q6^f~2N@q#{o%9dlLtBo4i_z0$=e)bhjZCzQwy2f zvpjZ^^;c#cF_SjgR=94hIFvZ-!>Y*~9k=uRpbY0Y89x?Ba}CQ|zAH9PSy#-nChtuA=nanb5hHn5THCN~Bt_Gs-2$7bL9;7MFBVK0$pQ?cDLUf(H#4RZ z2mNw3BeR9ti)BQ9;K5CAV`~L^FPO+ilU~c&?kSU^t7e!bMQ&+=MzM)lOtdJi&DgQA zi5{xldyKO;GpxMHY^a(;-UYtoiGAVPsmkwc@}qmc*Ntu>Z(UfDj+luHuct(6H#1?} z=PX5v%>fNA?7){o4VgLBceF{_8J1gQ>MHy5!*ndH0uL|I$9K@GV}bpM9TkfP<3RNL z(VazGHobNZu_9!BwS90gGN!a;>;09}W&(+O`sG09kIA(H`_XVdYX40sYSxkOFMhsz zS8~fdi<87trdW@rPBPF0?b&kn7VELYh9lg8^sMwp;Q^}>mY(^%tY}eMUpUKg1_J1Z zsYeg@hKEwVXv@Tv6pdRT^(<8sqMnodbIGs8{wB}0^1Lxm5Gz}T8o}QkO{KA7#|@~A zj^nY_>(&@sw7<}nQ{ Date: Wed, 1 Mar 2023 11:12:06 +0800 Subject: [PATCH 028/204] HikariCPEndpoint --- asset/java/HikariCPEndpoint.java | 38 ++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 asset/java/HikariCPEndpoint.java diff --git a/asset/java/HikariCPEndpoint.java b/asset/java/HikariCPEndpoint.java new file mode 100644 index 0000000..e8460aa --- /dev/null +++ b/asset/java/HikariCPEndpoint.java @@ -0,0 +1,38 @@ +package com.bosch.config; + +import com.zaxxer.hikari.HikariConfigMXBean; +import com.zaxxer.hikari.HikariDataSource; +import com.zaxxer.hikari.HikariPoolMXBean; +import org.springframework.boot.actuate.endpoint.annotation.Endpoint; +import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; + +import java.util.HashMap; +import java.util.Map; + + +@Endpoint(id="hikari") +public class HikariCPEndpoint { + + HikariDataSource dataSource; + + public HikariCPEndpoint(HikariDataSource dataSource) { + this.dataSource = dataSource; + } + + @ReadOperation + public Map info() { + + Map info = new HashMap<>(); + //连接池配置 + HikariConfigMXBean hikariConfigMXBean = dataSource.getHikariConfigMXBean(); + info.put("total",hikariConfigMXBean.getMaximumPoolSize()); + + //连接池运行状态 + HikariPoolMXBean hikariPoolMXBean = dataSource.getHikariPoolMXBean(); + info.put("active",hikariPoolMXBean.getActiveConnections()); + info.put("idle",hikariPoolMXBean.getIdleConnections()); + info.put("thread",hikariPoolMXBean.getThreadsAwaitingConnection()); + return info; + } + +} \ No newline at end of file -- Gitee From 7c3fadb2a7083783f836ab433a9f6cdc723d8f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 5 Mar 2023 22:25:37 +0800 Subject: [PATCH 029/204] =?UTF-8?q?gradle=E9=87=87=E7=94=A8=E8=85=BE?= =?UTF-8?q?=E8=AE=AF=E4=BB=A3=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ae04661..e920f08 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5.1-bin.zip +distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-7.5.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -- Gitee From c2b5926c89df7f024d5e8d1d7d7079edeb1c21cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 20 Mar 2023 20:02:02 +0800 Subject: [PATCH 030/204] =?UTF-8?q?=E7=83=AD=E5=8A=A0=E8=BD=BD=E5=BC=80?= =?UTF-8?q?=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +++++++++++ asset/img/update-vm-param.png | Bin 0 -> 187739 bytes 2 files changed, 11 insertions(+) create mode 100644 asset/img/update-vm-param.png diff --git a/README.md b/README.md index 46b3646..7fb8acd 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ Eric-Dream 功能 | 实现 | 用途 -----------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------|-------------- +IDEA开发热加载实现 | JBR + HotswapAgent | https://github.com/HotswapProjects/HotswapAgent [jackson序列化](SERIALIZE.md) | 自定义序列化器 | 解决参数枚举的序列化问题 logback钉钉通知 | 自定义Appender | Error消息及时通知 logback邮件通知 | 默认支持 | Error异常及时通知 @@ -23,6 +24,16 @@ Long类型超长转String | 具体框架如下表: +### 热加载技术 + +```shell +-XX:+AllowEnhancedClassRedefinition -XX:HotswapAgent=fatjar +``` + +![img_1.png](asset/img/update-vm-param.png) + +http://blog.houxiaoyi.cn/#/src/Java/%E7%83%AD%E5%8A%A0%E8%BD%BD + ### 执行初始化的sql语句 有两种方案。一种借助与mybatis-plus 另一种就是mybatis的 #### 基于mybatis的sql执行方案 diff --git a/asset/img/update-vm-param.png b/asset/img/update-vm-param.png new file mode 100644 index 0000000000000000000000000000000000000000..64f95cf68b8680de418055ee56608a0bd87c2f07 GIT binary patch literal 187739 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 ?se*{7T(*DJ?{0VjlUMe2<)6{{ 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

TD3p`q&eVY)%w%B|NG>)M&CnXH5kEj)|< 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

$&I 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 literal 0 HcmV?d00001 -- Gitee From 40180cb3e3decee5b7ce2452db12601ff2a5b464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 20 Mar 2023 20:02:02 +0800 Subject: [PATCH 031/204] =?UTF-8?q?=E7=83=AD=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 +++++++++++++++ .../dream/app/controller/LongController.java | 6 +++--- asset/img/update-vm-param.png | Bin 0 -> 187739 bytes 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 asset/img/update-vm-param.png diff --git a/README.md b/README.md index 46b3646..d6be950 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ Eric-Dream 功能 | 实现 | 用途 -----------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------|-------------- +IDEA开发热加载实现 | JBR + HotswapAgent | https://github.com/HotswapProjects/HotswapAgent [jackson序列化](SERIALIZE.md) | 自定义序列化器 | 解决参数枚举的序列化问题 logback钉钉通知 | 自定义Appender | Error消息及时通知 logback邮件通知 | 默认支持 | Error异常及时通知 @@ -23,6 +24,20 @@ Long类型超长转String | 具体框架如下表: +### 热加载技术 + +https://github.com/HotswapProjects/HotswapAgent + +```shell +-XX:+AllowEnhancedClassRedefinition -XX:HotswapAgent=fatjar +``` + +![img_1.png](asset/img/update-vm-param.png) + +Ctrl + Shift + F9 重新编译和加载修改的类文件即可。 + +> http://blog.houxiaoyi.cn/#/src/Java/%E7%83%AD%E5%8A%A0%E8%BD%BD + ### 执行初始化的sql语句 有两种方案。一种借助与mybatis-plus 另一种就是mybatis的 #### 基于mybatis的sql执行方案 diff --git a/app/src/main/java/hxy/dream/app/controller/LongController.java b/app/src/main/java/hxy/dream/app/controller/LongController.java index f78ac7a..6c5f4af 100644 --- a/app/src/main/java/hxy/dream/app/controller/LongController.java +++ b/app/src/main/java/hxy/dream/app/controller/LongController.java @@ -17,15 +17,15 @@ public class LongController { @GetMapping(value = "/long") public BaseResponseVO testLong() { HashMap map = new HashMap(); - map.put("string", "1111111"); + map.put("String", "1111111"); Long l = 9112222222222222222L; Long l2 = Long.valueOf(9112222222222222222L); long l3 = 90071992547409912L; long l4 = 9007199254740990L; map.put("long", l); map.put("Long", l2); - map.put("超过长度的", l3); - map.put("不会失去精度的", l4); + map.put("超过长度的,精度会丢失,所以转成字符串解决丢失问题", l3); + map.put("比较小,Browser不会失去精度的", l4); return BaseResponseVO.success(map); } } diff --git a/asset/img/update-vm-param.png b/asset/img/update-vm-param.png new file mode 100644 index 0000000000000000000000000000000000000000..64f95cf68b8680de418055ee56608a0bd87c2f07 GIT binary patch literal 187739 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 ?se*{7T(*DJ?{0VjlUMe2<)6{{ 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

TD3p`q&eVY)%w%B|NG>)M&CnXH5kEj)|< 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

$&I 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 literal 0 HcmV?d00001 -- Gitee From 70e158acd864575bbc83f5b9c118e10a197c8c6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 21 Mar 2023 22:28:30 +0800 Subject: [PATCH 032/204] =?UTF-8?q?=E5=A4=84=E7=90=86=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PathVariableController.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 app/src/main/java/hxy/dream/app/controller/PathVariableController.java diff --git a/app/src/main/java/hxy/dream/app/controller/PathVariableController.java b/app/src/main/java/hxy/dream/app/controller/PathVariableController.java new file mode 100644 index 0000000..8d144f4 --- /dev/null +++ b/app/src/main/java/hxy/dream/app/controller/PathVariableController.java @@ -0,0 +1,26 @@ +package hxy.dream.app.controller; + +import hxy.dream.entity.vo.BaseResponseVO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class PathVariableController { + + private static final Logger log = LoggerFactory.getLogger(PathVariableController.class); + + + /** + * @param variable + * @return + * @see org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#addMatchingMappings(java.util.Collection, java.util.List, jakarta.servlet.http.HttpServletRequest) + */ + @GetMapping("/path/variable/{variable}") + public BaseResponseVO path(@PathVariable(value = "variable") String variable) { + log.info("path: " + variable); + return BaseResponseVO.success(variable); + } +} -- Gitee From caa16bca42ef0292f0d28f4e5888afa185d869b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 25 Mar 2023 22:47:54 +0800 Subject: [PATCH 033/204] =?UTF-8?q?redis=E7=9A=84localDateTime=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/service/impl/UserServiceImpl.java | 3 + app/src/main/resources/application-beta.yml | 34 +++-- app/src/main/resources/application-test.yml | 34 +++-- common/build.gradle | 3 + .../common/configuration/BeanConfig.java | 3 + .../common/redis/DistributedLockHandler.java | 58 ++++++++ .../hxy/dream/common/redis/RedisConfig.java | 136 ++++++++++++++++++ .../common/redis/RedisConfigCacheManager.java | 66 +++++++++ .../LocalDateTimeJsonSerializer.java | 28 ++++ 9 files changed, 337 insertions(+), 28 deletions(-) create mode 100644 common/src/main/java/hxy/dream/common/redis/DistributedLockHandler.java create mode 100644 common/src/main/java/hxy/dream/common/redis/RedisConfig.java create mode 100644 common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java create mode 100644 common/src/main/java/hxy/dream/common/serializer/LocalDateTimeJsonSerializer.java diff --git a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java index 7528f64..fa9ba0e 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java @@ -8,9 +8,11 @@ import hxy.dream.dao.model.UserModel; import hxy.dream.entity.enums.GenderEnum; import hxy.dream.entity.vo.BaseResponseVO; import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; + import java.util.List; /** @@ -40,6 +42,7 @@ public class UserServiceImpl implements UserService { } @Override + @Cacheable(value = "UserService#36000", key = "'getUser'") public UserModel get(String id) { return userMapper.selectById(id); } diff --git a/app/src/main/resources/application-beta.yml b/app/src/main/resources/application-beta.yml index a710040..7db1d0d 100755 --- a/app/src/main/resources/application-beta.yml +++ b/app/src/main/resources/application-beta.yml @@ -19,20 +19,26 @@ spring: sql: init: platform: mysql -# redis: -# database: 0 -# host: 119.23.236.94 -# port: 6379 -# password: newpass -# jedis: -# pool: -# max-active: 8 -# cache: -# redis: -# time-to-live: 0s # 缓存过期时间30分钟 -# type: redis -# rabbitmq: -# host: 119.23.236.94 + data: + # redis 配置 + redis: + # 地址 121.36.136.109 localhost + host: 52.131.246.191 + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 3 + # 密码 + password: newpass + # 连接超时时间 + timeout: 10s + jedis: + pool: + min-idle: 10 + max-idle: 20 + max-wait: -1ms + max-active: 200 +# ssl: true logging: level: diff --git a/app/src/main/resources/application-test.yml b/app/src/main/resources/application-test.yml index bd590e2..04087a2 100755 --- a/app/src/main/resources/application-test.yml +++ b/app/src/main/resources/application-test.yml @@ -20,20 +20,26 @@ spring: sql: init: platform: mysql -# redis: -# database: 0 -# host: 119.23.236.94 -# port: 6379 -# password: newpass -# jedis: -# pool: -# max-active: 8 -# cache: -# redis: -# time-to-live: 0s # 缓存过期时间30分钟 -# type: redis -# rabbitmq: -# host: 119.23.236.94 + data: + # redis 配置 + redis: + # 地址 121.36.136.109 localhost + host: 52.131.246.191 + # 端口,默认为6379 + port: 6379 + # 数据库索引 + database: 3 + # 密码 + password: newpass + # 连接超时时间 + timeout: 10s + jedis: + pool: + min-idle: 10 + max-idle: 20 + max-wait: -1ms + max-active: 200 +# ssl: true logging: level: diff --git a/common/build.gradle b/common/build.gradle index 0ec3f28..7e26b0a 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -18,6 +18,9 @@ dependencies { api 'com.ejlchina:okhttps-jackson:3.4.0' api 'org.springframework.boot:spring-boot-starter-mail' + implementation 'org.springframework.data:spring-data-redis' + implementation 'redis.clients:jedis' + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.3' implementation group: 'org.javassist', name: 'javassist', version: '3.27.0-GA' implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.6' diff --git a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java index 0a3568d..890c1e2 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java @@ -19,6 +19,7 @@ import hxy.dream.common.serializer.BaseEnumSerializer; import hxy.dream.common.serializer.BaseLongSerializer; import hxy.dream.common.serializer.DateJsonDeserializer; import hxy.dream.common.serializer.DateJsonSerializer; +import hxy.dream.common.serializer.LocalDateTimeJsonSerializer; import hxy.dream.common.serializer.SimpleDeserializersWrapper; import hxy.dream.common.serializer.StringTrimDeserializer; import hxy.dream.entity.enums.BaseEnum; @@ -27,6 +28,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import java.time.LocalDateTime; import java.util.Date; import java.util.TimeZone; @@ -46,6 +48,7 @@ public class BeanConfig { simpleModule.addSerializer(BaseEnum.class, new BaseEnumSerializer()); simpleModule.addSerializer(Date.class, new DateJsonSerializer()); + simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeJsonSerializer()); // 超过浏览器处理精度的Long类型转成String给前端 simpleModule.addSerializer(Long.class, new BaseLongSerializer()); diff --git a/common/src/main/java/hxy/dream/common/redis/DistributedLockHandler.java b/common/src/main/java/hxy/dream/common/redis/DistributedLockHandler.java new file mode 100644 index 0000000..44849a1 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/redis/DistributedLockHandler.java @@ -0,0 +1,58 @@ +package hxy.dream.common.redis; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import java.util.concurrent.TimeUnit; + +/** + * 不是很严谨的分布式锁 + */ +@Component +public class DistributedLockHandler { + + private static final Logger log = LoggerFactory.getLogger(DistributedLockHandler.class); + + + public final static long LOCK_EXPIRE = 30 * 1000L; + public final static long LOCK_TRY_INTERVAL = 30L; + public final static long LOCK_TRY_TIMEOUT = 20 * 1000L; + + @Autowired + private RedisTemplate redisTemplate; + + public boolean getLock(String key, String value) { + try { + if (StringUtils.hasLength(key) && StringUtils.hasLength(value)) { + + long startTime = System.currentTimeMillis(); + do { + if (!redisTemplate.hasKey(key)) { + redisTemplate.opsForValue().set(key, value, LOCK_EXPIRE, TimeUnit.MILLISECONDS); + return true; + } + if (System.currentTimeMillis() - startTime > LOCK_TRY_TIMEOUT) { + // 获取锁超时,直接放弃 + return false; + } + Thread.sleep(LOCK_TRY_INTERVAL); + } while (redisTemplate.hasKey(key)); + } + } catch (InterruptedException e) { + log.error("{}", e.getMessage(), e); + return false; + } + return false; + } + + public void releaseLock(String key) { + if (StringUtils.hasLength(key)) { + redisTemplate.delete(key); + } + } + +} diff --git a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java new file mode 100644 index 0000000..1496c39 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java @@ -0,0 +1,136 @@ +package hxy.dream.common.redis; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; + +import java.time.Duration; +import java.time.format.DateTimeFormatter; + +/** + * redis配置 + * + */ +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport { + + @Autowired + RedisConnectionFactory redisConnectionFactory; + + + @Bean + public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { + Jackson2ObjectMapperBuilder builder = + new Jackson2ObjectMapperBuilder() + .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + .serializers( + new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"))) + .serializationInclusion(JsonInclude.Include.NON_NULL); + return new MappingJackson2HttpMessageConverter(builder.build()); + } + + @Bean + @Primary + public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer(){ + ObjectMapper om = new ObjectMapper(); + // 解决查询缓存转换异常的问题 + om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + // 支持 jdk 1.8 日期 ---- start --- + om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + om.registerModule(new Jdk8Module()) + .registerModule(new JavaTimeModule()) + .registerModule(new ParameterNamesModule()); + // --end -- + GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(om); + return genericJackson2JsonRedisSerializer; + } + + + @Bean + @Primary + @SuppressWarnings(value = { "unchecked", "rawtypes" }) + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) + { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + +// Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); + + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); +// serializer.setObjectMapper(mapper); + + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(genericJackson2JsonRedisSerializer()); + + // Hash的key也采用StringRedisSerializer的序列化方式 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(genericJackson2JsonRedisSerializer()); + template.setEnableTransactionSupport(true); + template.afterPropertiesSet(); + return template; + } + + @Override + @Bean + public CacheManager cacheManager() { + + ObjectMapper om = new ObjectMapper(); + RedisSerializer redisSerializer = new StringRedisSerializer(); + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>( + Object.class); + // 解决查询缓存转换异常的问题 + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + // 支持 jdk 1.8 日期 + om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + om.registerModule(new JavaTimeModule()); + om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + om.registerModule(new Jdk8Module()) + .registerModule(new JavaTimeModule()) + .registerModule(new ParameterNamesModule()); + jackson2JsonRedisSerializer.setObjectMapper(om); + // 配置序列化(解决乱码的问题) + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() + .entryTtl(Duration.ofMillis(-1)) + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) + .disableCachingNullValues(); + RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory); + + return new RedisConfigCacheManager(cacheWriter, config); + + } + +} diff --git a/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java b/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java new file mode 100644 index 0000000..ddb2ead --- /dev/null +++ b/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java @@ -0,0 +1,66 @@ +package hxy.dream.common.redis; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.cache.CacheKeyPrefix; +import org.springframework.data.redis.cache.RedisCache; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.cache.RedisCacheWriter; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.util.NumberUtils; + +import java.time.Duration; + +/** + * redis 配置类 + */ +@Slf4j +public class RedisConfigCacheManager extends RedisCacheManager { + + + public RedisConfigCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) { + super(cacheWriter, defaultCacheConfiguration); + } + + private static final RedisSerializationContext.SerializationPair DEFAULT_PAIR = RedisSerializationContext.SerializationPair + .fromSerializer(new GenericJackson2JsonRedisSerializer()); + + private static final CacheKeyPrefix DEFAULT_CACHE_KEY_PREFIX = cacheName -> cacheName + ":"; + + @Override + protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) { + + if (name != null && name.length() > 0) { + final int lastIndexOf = name.lastIndexOf('#'); + if (lastIndexOf > -1) { + final String ttl = name.substring(lastIndexOf + 1); + if (isNumeric(ttl)) { + final Duration duration = Duration.ofSeconds(Long.parseLong(ttl)); + cacheConfig = cacheConfig.entryTtl(duration); + //修改缓存key和value值的序列化方式 + cacheConfig = cacheConfig.computePrefixWith(DEFAULT_CACHE_KEY_PREFIX) + .serializeValuesWith(DEFAULT_PAIR); + final String cacheName = name.substring(0, lastIndexOf); + return super.createRedisCache(cacheName, cacheConfig); + } else { + log.error("过期时间配置错误!!!#号后面不是数字 => {}", ttl); + } + } + } + //修改缓存key和value值的序列化方式 + cacheConfig = cacheConfig.computePrefixWith(DEFAULT_CACHE_KEY_PREFIX) + .serializeValuesWith(DEFAULT_PAIR); + return super.createRedisCache(name, cacheConfig); + } + + public static boolean isNumeric(String str) { + for (int i = str.length(); --i >= 0; ) { + if (!Character.isDigit(str.charAt(i))) { + return false; + } + } + return true; + } + +} \ No newline at end of file diff --git a/common/src/main/java/hxy/dream/common/serializer/LocalDateTimeJsonSerializer.java b/common/src/main/java/hxy/dream/common/serializer/LocalDateTimeJsonSerializer.java new file mode 100644 index 0000000..c9a3b48 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/serializer/LocalDateTimeJsonSerializer.java @@ -0,0 +1,28 @@ +package hxy.dream.common.serializer; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +/** + * 或者直接yaml文件配置也是可以的 spring.jackson.date-format + */ +public class LocalDateTimeJsonSerializer extends JsonSerializer { + + DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + ZoneId zoneId = ZoneId.systemDefault(); + + @Override + public void serialize(LocalDateTime date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { +// LocalDateTime localDateTime = date.toInstant().atZone(zoneId).toLocalDateTime(); + String yearMonth = date.format(dtf); + jsonGenerator.writeString(yearMonth); + } + +} \ No newline at end of file -- Gitee From e6c2be9628e2e1c240c00f684125974b193d60a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 26 Mar 2023 10:44:59 +0800 Subject: [PATCH 034/204] add :jakarta.annotation-api --- entity/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entity/build.gradle b/entity/build.gradle index f3ba6bc..9d5f50f 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -11,6 +11,6 @@ dependencies { api 'com.baomidou:mybatis-plus-boot-starter:3.5.3' api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0' api 'org.springframework.boot:spring-boot-starter-validation' - + api 'jakarta.annotation:jakarta.annotation-api:2.1.1' } \ No newline at end of file -- Gitee From 7e14f1dd04a8c47d7eca311a6242e3e4652b5e76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 26 Mar 2023 11:14:44 +0800 Subject: [PATCH 035/204] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E8=BF=99=E4=B8=80?= =?UTF-8?q?=E9=83=A8=E5=88=86=E5=B0=B1=E4=BC=9A=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/service/impl/UserServiceImpl.java | 3 +- .../common/configuration/BeanConfig.java | 3 - .../hxy/dream/common/redis/RedisConfig.java | 110 ++++++++---------- .../common/redis/RedisConfigCacheManager.java | 1 - .../LocalDateTimeJsonSerializer.java | 28 ----- 5 files changed, 52 insertions(+), 93 deletions(-) delete mode 100644 common/src/main/java/hxy/dream/common/serializer/LocalDateTimeJsonSerializer.java diff --git a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java index fa9ba0e..f02b1fe 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java @@ -44,7 +44,8 @@ public class UserServiceImpl implements UserService { @Override @Cacheable(value = "UserService#36000", key = "'getUser'") public UserModel get(String id) { - return userMapper.selectById(id); + UserModel userModel = userMapper.selectById(id); + return userModel; } @Override diff --git a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java index 890c1e2..0a3568d 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java @@ -19,7 +19,6 @@ import hxy.dream.common.serializer.BaseEnumSerializer; import hxy.dream.common.serializer.BaseLongSerializer; import hxy.dream.common.serializer.DateJsonDeserializer; import hxy.dream.common.serializer.DateJsonSerializer; -import hxy.dream.common.serializer.LocalDateTimeJsonSerializer; import hxy.dream.common.serializer.SimpleDeserializersWrapper; import hxy.dream.common.serializer.StringTrimDeserializer; import hxy.dream.entity.enums.BaseEnum; @@ -28,7 +27,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; -import java.time.LocalDateTime; import java.util.Date; import java.util.TimeZone; @@ -48,7 +46,6 @@ public class BeanConfig { simpleModule.addSerializer(BaseEnum.class, new BaseEnumSerializer()); simpleModule.addSerializer(Date.class, new DateJsonSerializer()); - simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeJsonSerializer()); // 超过浏览器处理精度的Long类型转成String给前端 simpleModule.addSerializer(Long.class, new BaseLongSerializer()); diff --git a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java index 1496c39..d9895eb 100644 --- a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java +++ b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java @@ -1,15 +1,11 @@ package hxy.dream.common.redis; import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.CacheManager; @@ -19,6 +15,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; @@ -27,15 +24,13 @@ import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; -import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; -import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import java.time.Duration; -import java.time.format.DateTimeFormatter; +import java.util.HashSet; +import java.util.Set; /** * redis配置 - * */ @Configuration @EnableCaching @@ -44,21 +39,9 @@ public class RedisConfig extends CachingConfigurerSupport { @Autowired RedisConnectionFactory redisConnectionFactory; - - @Bean - public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { - Jackson2ObjectMapperBuilder builder = - new Jackson2ObjectMapperBuilder() - .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) - .serializers( - new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"))) - .serializationInclusion(JsonInclude.Include.NON_NULL); - return new MappingJackson2HttpMessageConverter(builder.build()); - } - @Bean @Primary - public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer(){ + public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer() { ObjectMapper om = new ObjectMapper(); // 解决查询缓存转换异常的问题 om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); @@ -70,47 +53,37 @@ public class RedisConfig extends CachingConfigurerSupport { .registerModule(new JavaTimeModule()) .registerModule(new ParameterNamesModule()); // --end -- - GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(om); + GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(om); return genericJackson2JsonRedisSerializer; } - @Bean @Primary - @SuppressWarnings(value = { "unchecked", "rawtypes" }) - public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) - { - RedisTemplate template = new RedisTemplate<>(); - template.setConnectionFactory(connectionFactory); - -// Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); - - ObjectMapper mapper = new ObjectMapper(); - mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); -// serializer.setObjectMapper(mapper); - - // 使用StringRedisSerializer来序列化和反序列化redis的key值 - template.setKeySerializer(new StringRedisSerializer()); - template.setValueSerializer(genericJackson2JsonRedisSerializer()); - - // Hash的key也采用StringRedisSerializer的序列化方式 - template.setHashKeySerializer(new StringRedisSerializer()); - template.setHashValueSerializer(genericJackson2JsonRedisSerializer()); - template.setEnableTransactionSupport(true); - template.afterPropertiesSet(); - return template; + public RedisTemplate redisTemplate() { + + RedisTemplate redisTemplate = new RedisTemplate(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + // 这里 + redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer()); + redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + // 这里 + redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer()); + redisTemplate.setEnableTransactionSupport(true); + redisTemplate.afterPropertiesSet(); + return redisTemplate; } - @Override @Bean + @Override public CacheManager cacheManager() { + // 设置序列化 + RedisSerializer stringSerializer = new StringRedisSerializer(); + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + + //解决查询缓存转换异常的问题 ObjectMapper om = new ObjectMapper(); - RedisSerializer redisSerializer = new StringRedisSerializer(); - Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>( - Object.class); - // 解决查询缓存转换异常的问题 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); // 支持 jdk 1.8 日期 @@ -121,16 +94,33 @@ public class RedisConfig extends CachingConfigurerSupport { .registerModule(new JavaTimeModule()) .registerModule(new ParameterNamesModule()); jackson2JsonRedisSerializer.setObjectMapper(om); - // 配置序列化(解决乱码的问题) + RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() - .entryTtl(Duration.ofMillis(-1)) - .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) + .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) - .disableCachingNullValues(); - RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory); - - return new RedisConfigCacheManager(cacheWriter, config); - + .disableCachingNullValues() + // 缓存过期时间 + .entryTtl(Duration.ofMinutes(30)); + + boolean ok = false; + if (ok) { + // TODO 这一部分不会报错,但是redis的缓存失效时间就没有实现了 + RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder + .fromConnectionFactory(redisConnectionFactory) + .cacheDefaults(config) + .transactionAware(); + @SuppressWarnings("serial") + Set cacheNames = new HashSet() { + { + add("codeNameCache"); + } + }; + builder.initialCacheNames(cacheNames); + return builder.build(); + } else { + // FIXME 使用这一部分就会报错 + RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory); + return new RedisConfigCacheManager(cacheWriter, config); + } } - } diff --git a/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java b/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java index ddb2ead..8857f57 100644 --- a/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java +++ b/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java @@ -8,7 +8,6 @@ import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; -import org.springframework.util.NumberUtils; import java.time.Duration; diff --git a/common/src/main/java/hxy/dream/common/serializer/LocalDateTimeJsonSerializer.java b/common/src/main/java/hxy/dream/common/serializer/LocalDateTimeJsonSerializer.java deleted file mode 100644 index c9a3b48..0000000 --- a/common/src/main/java/hxy/dream/common/serializer/LocalDateTimeJsonSerializer.java +++ /dev/null @@ -1,28 +0,0 @@ -package hxy.dream.common.serializer; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.JsonSerializer; -import com.fasterxml.jackson.databind.SerializerProvider; - -import java.io.IOException; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.Date; - -/** - * 或者直接yaml文件配置也是可以的 spring.jackson.date-format - */ -public class LocalDateTimeJsonSerializer extends JsonSerializer { - - DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - ZoneId zoneId = ZoneId.systemDefault(); - - @Override - public void serialize(LocalDateTime date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { -// LocalDateTime localDateTime = date.toInstant().atZone(zoneId).toLocalDateTime(); - String yearMonth = date.format(dtf); - jsonGenerator.writeString(yearMonth); - } - -} \ No newline at end of file -- Gitee From 9afede7be63968e4d1b1e2dd5630f4d8e5792b9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 26 Mar 2023 11:56:37 +0800 Subject: [PATCH 036/204] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E8=BD=AC=E6=8D=A2=E5=BC=82=E5=B8=B8=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/configuration/BeanConfig.java | 17 ++++++++++++ .../hxy/dream/common/redis/RedisConfig.java | 26 +++++-------------- .../common/redis/RedisConfigCacheManager.java | 15 +++++++++-- .../serializer/DefaultInputJsonToEnum.java | 2 +- .../java/hxy/dream/entity/enums/BaseEnum.java | 2 ++ 5 files changed, 39 insertions(+), 23 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java index 0a3568d..2a59104 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java @@ -11,9 +11,15 @@ import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; import hxy.dream.common.serializer.BaseEnumDeserializer; import hxy.dream.common.serializer.BaseEnumSerializer; import hxy.dream.common.serializer.BaseLongSerializer; @@ -57,6 +63,17 @@ public class BeanConfig { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.registerModule(simpleModule); + // 解决查询缓存转换异常的问题 + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + // 支持 jdk 1.8 日期 ---- start --- + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + objectMapper.registerModule(new Jdk8Module()) + .registerModule(new JavaTimeModule()) + .registerModule(new ParameterNamesModule()); + // --end -- + // 配置忽略未知属性 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); diff --git a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java index d9895eb..2f96df9 100644 --- a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java +++ b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java @@ -39,23 +39,8 @@ public class RedisConfig extends CachingConfigurerSupport { @Autowired RedisConnectionFactory redisConnectionFactory; - @Bean - @Primary - public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer() { - ObjectMapper om = new ObjectMapper(); - // 解决查询缓存转换异常的问题 - om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); - // 支持 jdk 1.8 日期 ---- start --- - om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - om.registerModule(new Jdk8Module()) - .registerModule(new JavaTimeModule()) - .registerModule(new ParameterNamesModule()); - // --end -- - GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(om); - return genericJackson2JsonRedisSerializer; - } + @Autowired + ObjectMapper objectMapper; @Bean @Primary @@ -63,12 +48,13 @@ public class RedisConfig extends CachingConfigurerSupport { RedisTemplate redisTemplate = new RedisTemplate(); redisTemplate.setConnectionFactory(redisConnectionFactory); + // 这里 redisTemplate.setKeySerializer(new StringRedisSerializer()); + GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(objectMapper); + redisTemplate.setValueSerializer(serializer); // 这里 - redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); - // 这里 - redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer()); + redisTemplate.setHashValueSerializer(serializer); redisTemplate.setEnableTransactionSupport(true); redisTemplate.afterPropertiesSet(); return redisTemplate; diff --git a/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java b/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java index 8857f57..887e711 100644 --- a/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java +++ b/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java @@ -1,5 +1,13 @@ package hxy.dream.common.redis; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; +import hxy.dream.common.util.SpringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.cache.CacheKeyPrefix; import org.springframework.data.redis.cache.RedisCache; @@ -22,14 +30,17 @@ public class RedisConfigCacheManager extends RedisCacheManager { super(cacheWriter, defaultCacheConfiguration); } - private static final RedisSerializationContext.SerializationPair DEFAULT_PAIR = RedisSerializationContext.SerializationPair - .fromSerializer(new GenericJackson2JsonRedisSerializer()); private static final CacheKeyPrefix DEFAULT_CACHE_KEY_PREFIX = cacheName -> cacheName + ":"; @Override protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) { + ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class); + + RedisSerializationContext.SerializationPair DEFAULT_PAIR = RedisSerializationContext.SerializationPair + .fromSerializer(new GenericJackson2JsonRedisSerializer(objectMapper)); + if (name != null && name.length() > 0) { final int lastIndexOf = name.lastIndexOf('#'); if (lastIndexOf > -1) { diff --git a/common/src/main/java/hxy/dream/common/serializer/DefaultInputJsonToEnum.java b/common/src/main/java/hxy/dream/common/serializer/DefaultInputJsonToEnum.java index fb6619f..2e19af9 100644 --- a/common/src/main/java/hxy/dream/common/serializer/DefaultInputJsonToEnum.java +++ b/common/src/main/java/hxy/dream/common/serializer/DefaultInputJsonToEnum.java @@ -29,7 +29,7 @@ public class DefaultInputJsonToEnum { for (BaseEnum value : values) { //因为inputParameter都是string类型的,code转成字符串才能比较 - if (inputParameter.equals(String.valueOf(value.code())) || inputParameter.equals(value.description())) { + if (inputParameter.equals(String.valueOf(value.code())) || inputParameter.equals(value.description())|| inputParameter.equals(value.name())) { baseEnum = value; break; } diff --git a/entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java b/entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java index cb60938..5a2fdc1 100644 --- a/entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java +++ b/entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java @@ -20,4 +20,6 @@ public interface BaseEnum { */ String description(); + String name(); + } \ No newline at end of file -- Gitee From 08c4cfbcaf713e0e0004fc72b575cc3704be5c3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 26 Mar 2023 12:10:43 +0800 Subject: [PATCH 037/204] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E8=BD=AC=E6=8D=A2=E5=BC=82=E5=B8=B8=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/configuration/BeanConfig.java | 11 ++----- .../hxy/dream/common/redis/RedisConfig.java | 31 ++++++++++++++++--- .../common/redis/RedisConfigCacheManager.java | 21 +++++++++++-- 3 files changed, 47 insertions(+), 16 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java index 2a59104..a356d4d 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java @@ -11,15 +11,9 @@ import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; -import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; import hxy.dream.common.serializer.BaseEnumDeserializer; import hxy.dream.common.serializer.BaseEnumSerializer; import hxy.dream.common.serializer.BaseLongSerializer; @@ -62,8 +56,8 @@ public class BeanConfig { builder.timeZone(TimeZone.getDefault()); ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.registerModule(simpleModule); - - // 解决查询缓存转换异常的问题 +/* + // FIXME 解决查询缓存转换异常的问题,这个月应该加在redis自己里面,加在全局,就会操作返回值里面带上类信息。 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); @@ -74,6 +68,7 @@ public class BeanConfig { .registerModule(new ParameterNamesModule()); // --end -- + */ // 配置忽略未知属性 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); diff --git a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java index 2f96df9..81c4e24 100644 --- a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java +++ b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java @@ -39,8 +39,28 @@ public class RedisConfig extends CachingConfigurerSupport { @Autowired RedisConnectionFactory redisConnectionFactory; - @Autowired - ObjectMapper objectMapper; + /** + * 这个仅仅针对Redis 序列化问题解决! 不能纳入到全局,否则会造成返回前端带上了类名。 + * + * @return + */ + @Bean + @Primary + public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer() { + ObjectMapper om = new ObjectMapper(); + // 解决查询缓存转换异常的问题 + om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + // 支持 jdk 1.8 日期 ---- start --- + om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + om.registerModule(new Jdk8Module()) + .registerModule(new JavaTimeModule()) + .registerModule(new ParameterNamesModule()); + // --end -- + GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(om); + return genericJackson2JsonRedisSerializer; + } @Bean @Primary @@ -50,7 +70,7 @@ public class RedisConfig extends CachingConfigurerSupport { redisTemplate.setConnectionFactory(redisConnectionFactory); // 这里 redisTemplate.setKeySerializer(new StringRedisSerializer()); - GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer(objectMapper); + GenericJackson2JsonRedisSerializer serializer = genericJackson2JsonRedisSerializer(); redisTemplate.setValueSerializer(serializer); // 这里 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); @@ -85,8 +105,9 @@ public class RedisConfig extends CachingConfigurerSupport { .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues() - // 缓存过期时间 - .entryTtl(Duration.ofMinutes(30)); + // 缓存过期时间 Duration.ZERO -> eternal + .entryTtl(Duration.ZERO); +// .entryTtl(Duration.ofMinutes(30)); boolean ok = false; if (ok) { diff --git a/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java b/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java index 887e711..10e5778 100644 --- a/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java +++ b/common/src/main/java/hxy/dream/common/redis/RedisConfigCacheManager.java @@ -7,7 +7,6 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; -import hxy.dream.common.util.SpringUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.cache.CacheKeyPrefix; import org.springframework.data.redis.cache.RedisCache; @@ -36,10 +35,10 @@ public class RedisConfigCacheManager extends RedisCacheManager { @Override protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) { - ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class); +// GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = SpringUtils.getBean(GenericJackson2JsonRedisSerializer.class); RedisSerializationContext.SerializationPair DEFAULT_PAIR = RedisSerializationContext.SerializationPair - .fromSerializer(new GenericJackson2JsonRedisSerializer(objectMapper)); + .fromSerializer(genericJackson2JsonRedisSerializer()); if (name != null && name.length() > 0) { final int lastIndexOf = name.lastIndexOf('#'); @@ -64,6 +63,22 @@ public class RedisConfigCacheManager extends RedisCacheManager { return super.createRedisCache(name, cacheConfig); } + public GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer() { + ObjectMapper om = new ObjectMapper(); + // 解决查询缓存转换异常的问题 + om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + // 支持 jdk 1.8 日期 ---- start --- + om.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); + om.registerModule(new Jdk8Module()) + .registerModule(new JavaTimeModule()) + .registerModule(new ParameterNamesModule()); + // --end -- + GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(om); + return genericJackson2JsonRedisSerializer; + } + public static boolean isNumeric(String str) { for (int i = str.length(); --i >= 0; ) { if (!Character.isDigit(str.charAt(i))) { -- Gitee From 078cbe5ad90b153ef06fcf4f13c739693315116d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 26 Mar 2023 12:12:00 +0800 Subject: [PATCH 038/204] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E8=BD=AC=E6=8D=A2=E5=BC=82=E5=B8=B8=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SERIALIZE.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/SERIALIZE.md b/SERIALIZE.md index 4db64a9..dc8aa4d 100644 --- a/SERIALIZE.md +++ b/SERIALIZE.md @@ -713,6 +713,10 @@ https://github.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample > https://www.cnblogs.com/xwzp/p/14685452.html +# 解决 redis 序列化 java8 LocalDateTime 问题 + +https://blog.csdn.net/zhuzhoulin/article/details/106758473 + ### 配置文件 ![img.png](img.png) -- Gitee From 4c362c72b5ff08734f5b7bb0674ce004b52a9798 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 26 Mar 2023 13:00:27 +0800 Subject: [PATCH 039/204] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E8=BD=AC=E6=8D=A2=E5=BC=82=E5=B8=B8=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20http://blog.houxiaoyi.cn/#/src/Java/Spring?= =?UTF-8?q?Boot/Redis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/src/main/java/hxy/dream/common/redis/RedisConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java index 81c4e24..1ddd06f 100644 --- a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java +++ b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java @@ -111,7 +111,7 @@ public class RedisConfig extends CachingConfigurerSupport { boolean ok = false; if (ok) { - // TODO 这一部分不会报错,但是redis的缓存失效时间就没有实现了 + // TODO 这一部分不会报错,但是redis的缓存失效时间就没有实现了。使用的是默认失效时间,应该就是不失效 RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager.RedisCacheManagerBuilder .fromConnectionFactory(redisConnectionFactory) .cacheDefaults(config) @@ -125,7 +125,7 @@ public class RedisConfig extends CachingConfigurerSupport { builder.initialCacheNames(cacheNames); return builder.build(); } else { - // FIXME 使用这一部分就会报错 + // FIXME 使用这个可以自定义管理缓存时间 RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory); return new RedisConfigCacheManager(cacheWriter, config); } -- Gitee From 1466a2976b4b8458d50840cb55097a3abfef3349 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 26 Mar 2023 13:08:59 +0800 Subject: [PATCH 040/204] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/hxy/dream/app/service/impl/UserServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java index f02b1fe..14e98be 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java @@ -42,7 +42,7 @@ public class UserServiceImpl implements UserService { } @Override - @Cacheable(value = "UserService#36000", key = "'getUser'") + @Cacheable(value = "UserService#36000", key = "'getUser'+#id") public UserModel get(String id) { UserModel userModel = userMapper.selectById(id); return userModel; -- Gitee From c96150053c4fcbd9df79888baa4f0b09a5f605a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 27 Mar 2023 01:05:22 +0800 Subject: [PATCH 041/204] =?UTF-8?q?mail=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hxy/dream/common/email/EmailTest.java | 70 ++++++++++++++++++- app/src/test/resources/api/local.http | 2 +- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/app/src/test/java/hxy/dream/common/email/EmailTest.java b/app/src/test/java/hxy/dream/common/email/EmailTest.java index 18c4238..f652570 100644 --- a/app/src/test/java/hxy/dream/common/email/EmailTest.java +++ b/app/src/test/java/hxy/dream/common/email/EmailTest.java @@ -1,11 +1,22 @@ package hxy.dream.common.email; import hxy.dream.BaseTest; +import jakarta.mail.Flags; +import jakarta.mail.Folder; +import jakarta.mail.Message; +import jakarta.mail.MessagingException; +import jakarta.mail.NoSuchProviderException; +import jakarta.mail.Session; +import jakarta.mail.Store; import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSenderImpl; +import java.util.Properties; + /** * @author eric * @program multi-gradle @@ -14,11 +25,14 @@ import org.springframework.mail.javamail.JavaMailSenderImpl; */ public class EmailTest extends BaseTest { + private static final Logger log = LoggerFactory.getLogger(EmailTest.class); + + @Autowired private JavaMailSenderImpl mailSender; @Test - public void emailTest(){ + public void emailTest() { //简单邮件 SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); simpleMailMessage.setFrom("aohanhongzhi@qq.com"); @@ -29,4 +43,58 @@ public class EmailTest extends BaseTest { // 原文链接:https://blog.csdn.net/qq_26383975/article/details/121957917 } + + @Test + public void deleteEmail() { + try { + + Properties props = new Properties(); + Session session = Session.getDefaultInstance(props); + //取得pop3协议的邮件服务器 + Store store = null; + store = session.getStore("pop3"); + + //连接pop.qq.com邮件服务器 + store.connect("pop.qq.com", "aohanhongzhi@qq.com", "vtrxapjtpcivdbcb"); + + int k = 0; + while (k < 100) { + //返回文件夹对象 + Folder folder = store.getFolder("INBOX"); + //设置读写 + folder.open(Folder.READ_WRITE); + //获取信息 + Message message[] = folder.getMessages(); + int j = 0; + for (int i = 0; i < message.length && j < 200; i++) { + String subject = message[i].getSubject(); + String from = message[i].getFrom()[0].toString(); + + if (subject.contains("RBLC-ADMIN") || subject.contains("GitHub") || subject.contains("物联网通信计费策略调整") || from.contains("register.csdn.net")|| from.contains("tencent.com") || from.contains("github.com") ) { + //设置删除标记 + message[i].setFlag(Flags.Flag.DELETED, true); + j++; + log.warn("{}删除邮件 {}", j, subject); + } else { + log.info(i + ": " + from + "\t" + subject); + } + } + log.warn("删除{}邮件", j); + if (j > 0) { + folder.close(true); + } else { + folder.close(); + break; + } + k++; + } + + store.close(); + } catch (NoSuchProviderException e) { + throw new RuntimeException(e); + } catch (MessagingException e) { + throw new RuntimeException(e); + } + } + } diff --git a/app/src/test/resources/api/local.http b/app/src/test/resources/api/local.http index f1bce40..6d4be62 100644 --- a/app/src/test/resources/api/local.http +++ b/app/src/test/resources/api/local.http @@ -1,4 +1,4 @@ -GET http://localhost:8080/user/get/12 +GET http://localhost:8080/user/get/9 ### 添加 POST http://localhost:8080/user/add/body -- Gitee From 4149ef88caeda397b09f2ba971337107d55b92e1 Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Mon, 27 Mar 2023 10:10:50 +0800 Subject: [PATCH 042/204] =?UTF-8?q?=E6=9B=B4=E6=96=B0deprecated=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/src/main/java/hxy/dream/common/redis/RedisConfig.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java index 1ddd06f..2a07cb8 100644 --- a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java +++ b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java @@ -86,7 +86,6 @@ public class RedisConfig extends CachingConfigurerSupport { // 设置序列化 RedisSerializer stringSerializer = new StringRedisSerializer(); - Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //解决查询缓存转换异常的问题 ObjectMapper om = new ObjectMapper(); @@ -99,7 +98,7 @@ public class RedisConfig extends CachingConfigurerSupport { om.registerModule(new Jdk8Module()) .registerModule(new JavaTimeModule()) .registerModule(new ParameterNamesModule()); - jackson2JsonRedisSerializer.setObjectMapper(om); + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(om, Object.class); RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringSerializer)) -- Gitee From 8355def2542be988fe6b1b7ff0370a01dc53b12a Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Mon, 3 Apr 2023 16:12:22 +0800 Subject: [PATCH 043/204] DEBUG_LOCATION_PROPERTY --- app/src/main/java/hxy/dream/app/Application.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/hxy/dream/app/Application.java b/app/src/main/java/hxy/dream/app/Application.java index 5c59800..de98514 100644 --- a/app/src/main/java/hxy/dream/app/Application.java +++ b/app/src/main/java/hxy/dream/app/Application.java @@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.cglib.core.DebuggingClassWriter; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.scheduling.annotation.EnableAsync; @@ -23,6 +24,8 @@ public class Application { public static void main(String[] args) { + log.info("\n<============ \uD83D\uDE80 JAVA版本:{} CPU核心数:{} \uD83D\uDE80 ============>", System.getProperty("java.version"), Runtime.getRuntime().availableProcessors()); + System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "class"); log.info("当前CPU核心={},{}是否为守护线程={}",Runtime.getRuntime().availableProcessors(), Thread.currentThread().getName(), Thread.currentThread().isDaemon()); ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); log.trace("方便打断点"); -- Gitee From 4281013787c89e1ee6c49780b45aa8f6c3111022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 7 Apr 2023 22:28:18 +0800 Subject: [PATCH 044/204] 1 --- .../dream/app/controller/UserController.java | 14 +++++- .../hxy/dream/common/email/EmailTest.java | 48 +++++++++++++++---- .../java/hxy/dream/entity/dto/OtherInfo.java | 32 +++++++------ 3 files changed, 69 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/hxy/dream/app/controller/UserController.java b/app/src/main/java/hxy/dream/app/controller/UserController.java index b4844f7..187e1b8 100644 --- a/app/src/main/java/hxy/dream/app/controller/UserController.java +++ b/app/src/main/java/hxy/dream/app/controller/UserController.java @@ -6,6 +6,7 @@ import hxy.dream.app.service.UserService; import hxy.dream.common.converter.StringToEnumConverter; import hxy.dream.common.serializer.BaseEnumDeserializer; import hxy.dream.dao.model.UserModel; +import hxy.dream.entity.dto.OtherInfo; import hxy.dream.entity.vo.BaseResponseVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -18,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import jakarta.validation.Valid; + import java.util.List; /** @@ -36,6 +38,14 @@ public class UserController { public BaseResponseVO get(@PathVariable("id") String id) { log.info("\n====>当前获取的id是{}", id); UserModel userModel = userService.get(id); + if (userModel != null) { + OtherInfo otherInfo = userModel.getOtherInfo(); + if (otherInfo != null) { + String city = otherInfo.city(); + log.info("city: " + city); + } + + } return BaseResponseVO.success(userModel); } @@ -43,7 +53,7 @@ public class UserController { @GetMapping("exist/{id}") public BaseResponseVO exist(@PathVariable("id") String id) { log.info("\n====>当前获取的id是{}", id); - return userService.exist(id); + return userService.exist(id); } @@ -75,7 +85,7 @@ public class UserController { * @see StringToEnumConverter */ @PostMapping("add/form") - public BaseResponseVO saveForm(@Valid UserParam userParam) { + public BaseResponseVO saveForm(@Valid UserParam userParam) { log.debug("\n====>当前添加的用户信息是{}", userParam); UserModel userModel = userService.add(userParam); return BaseResponseVO.success(userModel); diff --git a/app/src/test/java/hxy/dream/common/email/EmailTest.java b/app/src/test/java/hxy/dream/common/email/EmailTest.java index f652570..ee896fa 100644 --- a/app/src/test/java/hxy/dream/common/email/EmailTest.java +++ b/app/src/test/java/hxy/dream/common/email/EmailTest.java @@ -1,5 +1,6 @@ package hxy.dream.common.email; +import com.sun.mail.pop3.POP3Folder; import hxy.dream.BaseTest; import jakarta.mail.Flags; import jakarta.mail.Folder; @@ -50,6 +51,7 @@ public class EmailTest extends BaseTest { Properties props = new Properties(); Session session = Session.getDefaultInstance(props); + session.setDebug(true); //取得pop3协议的邮件服务器 Store store = null; store = session.getStore("pop3"); @@ -57,10 +59,43 @@ public class EmailTest extends BaseTest { //连接pop.qq.com邮件服务器 store.connect("pop.qq.com", "aohanhongzhi@qq.com", "vtrxapjtpcivdbcb"); + Folder[] personalNamespaces = store.getPersonalNamespaces(); + for (Folder folder : personalNamespaces) { + + if (folder instanceof POP3Folder) { + start(folder); + } + + } +// //返回文件夹对象 + Folder defaultFolder = store.getDefaultFolder(); + Folder[] allFolder = defaultFolder.list(); + + for (Folder folder : allFolder) { + + if (folder instanceof POP3Folder) { + start(folder); + } + + } + + // POP3Folder + Folder folder = store.getFolder("INBOX"); + start(folder); + + store.close(); + } catch (NoSuchProviderException e) { + throw new RuntimeException(e); + } catch (MessagingException e) { + throw new RuntimeException(e); + } + } + + + public void start(Folder folder) throws MessagingException { + if (folder instanceof POP3Folder) { int k = 0; while (k < 100) { - //返回文件夹对象 - Folder folder = store.getFolder("INBOX"); //设置读写 folder.open(Folder.READ_WRITE); //获取信息 @@ -70,7 +105,7 @@ public class EmailTest extends BaseTest { String subject = message[i].getSubject(); String from = message[i].getFrom()[0].toString(); - if (subject.contains("RBLC-ADMIN") || subject.contains("GitHub") || subject.contains("物联网通信计费策略调整") || from.contains("register.csdn.net")|| from.contains("tencent.com") || from.contains("github.com") ) { + if (subject.contains("RBLC-ADMIN") || subject.contains("GitHub") || subject.contains("物联网通信计费策略调整") || from.contains("register.csdn.net") || from.contains("tencent.com") || from.contains("github.com")) { //设置删除标记 message[i].setFlag(Flags.Flag.DELETED, true); j++; @@ -88,13 +123,8 @@ public class EmailTest extends BaseTest { } k++; } - - store.close(); - } catch (NoSuchProviderException e) { - throw new RuntimeException(e); - } catch (MessagingException e) { - throw new RuntimeException(e); } + } } diff --git a/entity/src/main/java/hxy/dream/entity/dto/OtherInfo.java b/entity/src/main/java/hxy/dream/entity/dto/OtherInfo.java index 9965ec1..d161f2e 100644 --- a/entity/src/main/java/hxy/dream/entity/dto/OtherInfo.java +++ b/entity/src/main/java/hxy/dream/entity/dto/OtherInfo.java @@ -2,17 +2,21 @@ package hxy.dream.entity.dto; import lombok.Data; -/** - * 其他信息 - */ -@Data -public class OtherInfo { - /** - * 性别 - */ - private String sex; - /** - * 居住城市 - */ - private String city; -} \ No newline at end of file +// 貌似没有setter方法 +public record OtherInfo(String sex, String city) { + +} +///** +// * 其他信息 +// */ +//@Data +//public class OtherInfo { +// /** +// * 性别 +// */ +// private String sex; +// /** +// * 居住城市 +// */ +// private String city; +//} \ No newline at end of file -- Gitee From b555e2bba8b4b709a11c0fb6a24ed7dd81f4b04a Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Mon, 10 Apr 2023 13:09:39 +0800 Subject: [PATCH 045/204] =?UTF-8?q?=E9=82=AE=E4=BB=B6=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E6=A3=80=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/test/java/hxy/dream/common/email/EmailTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/hxy/dream/common/email/EmailTest.java b/app/src/test/java/hxy/dream/common/email/EmailTest.java index f652570..fa3a620 100644 --- a/app/src/test/java/hxy/dream/common/email/EmailTest.java +++ b/app/src/test/java/hxy/dream/common/email/EmailTest.java @@ -8,6 +8,7 @@ import jakarta.mail.MessagingException; import jakarta.mail.NoSuchProviderException; import jakarta.mail.Session; import jakarta.mail.Store; +import jakarta.mail.search.SubjectTerm; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,14 +64,16 @@ public class EmailTest extends BaseTest { Folder folder = store.getFolder("INBOX"); //设置读写 folder.open(Folder.READ_WRITE); + String subjectTitle = "dragon"; //获取信息 Message message[] = folder.getMessages(); +// Message message[] = folder.search(new SubjectTerm("dragon")); int j = 0; for (int i = 0; i < message.length && j < 200; i++) { String subject = message[i].getSubject(); String from = message[i].getFrom()[0].toString(); - if (subject.contains("RBLC-ADMIN") || subject.contains("GitHub") || subject.contains("物联网通信计费策略调整") || from.contains("register.csdn.net")|| from.contains("tencent.com") || from.contains("github.com") ) { + if (subject.contains(subjectTitle) || subject.contains("RBLC-ADMIN") || subject.contains("GitHub") || subject.contains("物联网通信计费策略调整") || from.contains("register.csdn.net") || from.contains("tencent.com") || from.contains("github.com")) { //设置删除标记 message[i].setFlag(Flags.Flag.DELETED, true); j++; -- Gitee From b100d92dcec879fc59b22b81a63a99883adfd3ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 19 Apr 2023 16:04:11 +0800 Subject: [PATCH 046/204] =?UTF-8?q?=E5=9F=BA=E4=BA=8E=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E5=99=A8=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/hxy/dream/app/controller/UserController.java | 2 +- .../java/hxy/dream/app/service/impl/UserServiceImpl.java | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/hxy/dream/app/controller/UserController.java b/app/src/main/java/hxy/dream/app/controller/UserController.java index 187e1b8..90fb6b0 100644 --- a/app/src/main/java/hxy/dream/app/controller/UserController.java +++ b/app/src/main/java/hxy/dream/app/controller/UserController.java @@ -32,7 +32,7 @@ import java.util.List; public class UserController { @Autowired - UserService userService; + private UserService userService; @GetMapping("get/{id}") public BaseResponseVO get(@PathVariable("id") String id) { diff --git a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java index 14e98be..ae32347 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java @@ -7,6 +7,7 @@ import hxy.dream.dao.mapper.UserMapper; import hxy.dream.dao.model.UserModel; import hxy.dream.entity.enums.GenderEnum; import hxy.dream.entity.vo.BaseResponseVO; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; @@ -20,10 +21,11 @@ import java.util.List; */ @Slf4j @Service +@RequiredArgsConstructor public class UserServiceImpl implements UserService { - @Resource - UserMapper userMapper; + // @Resource 可以通过上面的 @RequiredArgsConstructor注解来生成构造器。需要final标记 + private final UserMapper userMapper; @Override public UserModel add(UserParam userParam) { -- Gitee From cd112934a3c4b8dfd6b97b2eee1cee2b17165976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 19 Apr 2023 16:38:55 +0800 Subject: [PATCH 047/204] LocalDateTime --- .../java/hxy/dream/common/configuration/BeanConfig.java | 8 ++++++++ .../hxy/dream/common/serializer/BaseLongSerializer.java | 3 ++- entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java | 2 ++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java index a356d4d..71eb184 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java @@ -14,6 +14,8 @@ import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerIntercept import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import hxy.dream.common.serializer.BaseEnumDeserializer; import hxy.dream.common.serializer.BaseEnumSerializer; import hxy.dream.common.serializer.BaseLongSerializer; @@ -27,6 +29,8 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.TimeZone; @@ -47,6 +51,10 @@ public class BeanConfig { simpleModule.addSerializer(BaseEnum.class, new BaseEnumSerializer()); simpleModule.addSerializer(Date.class, new DateJsonSerializer()); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); + simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); + // 超过浏览器处理精度的Long类型转成String给前端 simpleModule.addSerializer(Long.class, new BaseLongSerializer()); simpleModule.addSerializer(Long.TYPE, new BaseLongSerializer()); diff --git a/common/src/main/java/hxy/dream/common/serializer/BaseLongSerializer.java b/common/src/main/java/hxy/dream/common/serializer/BaseLongSerializer.java index eed1237..0040049 100644 --- a/common/src/main/java/hxy/dream/common/serializer/BaseLongSerializer.java +++ b/common/src/main/java/hxy/dream/common/serializer/BaseLongSerializer.java @@ -21,8 +21,9 @@ public class BaseLongSerializer extends JsonSerializer { */ @Override public void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException { - if (value > 9007199254740990L) { + if (value != null && (value > 9007199254740990L || value.toString().length() > 16)) { gen.writeNumber("\"" + value + "\""); +// gen.writeString(value.toString()); } else { gen.writeNumber(value); } diff --git a/entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java b/entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java index 5a2fdc1..7ca5ab9 100644 --- a/entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java +++ b/entity/src/main/java/hxy/dream/entity/enums/BaseEnum.java @@ -5,6 +5,7 @@ package hxy.dream.entity.enums; */ // 如果发现注入的bean无法解决json序列化问题,那么可以加上这个注解 //@JsonFormat(shape = JsonFormat.Shape.OBJECT) +// 有必要的话,这个也是可以加一个泛型的,表示支持 Integer或者其他的。 public interface BaseEnum { /** * Code integer. @@ -12,6 +13,7 @@ public interface BaseEnum { * @return the integer */ Integer code(); +// T code(); /** * Description string. -- Gitee From 937ccb9b1942dcc6106fe0a011e0d8b604087348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 19 Apr 2023 17:18:34 +0800 Subject: [PATCH 048/204] stream --- .../hxy/dream/app/service/impl/EnumTest.java | 2 +- .../hxy/dream/entity/enums/GenderEnum.java | 26 ++++++++++++------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/app/src/test/java/hxy/dream/app/service/impl/EnumTest.java b/app/src/test/java/hxy/dream/app/service/impl/EnumTest.java index a768b58..51e7d1d 100644 --- a/app/src/test/java/hxy/dream/app/service/impl/EnumTest.java +++ b/app/src/test/java/hxy/dream/app/service/impl/EnumTest.java @@ -45,7 +45,7 @@ public class EnumTest extends BaseTest { @org.junit.Test public void enumJsonTest2(){ - GenderEnum byCode = GenderEnum.getEnumByCode(1); + GenderEnum byCode = GenderEnum.getEnumByCode(100); System.out.println(byCode); } diff --git a/entity/src/main/java/hxy/dream/entity/enums/GenderEnum.java b/entity/src/main/java/hxy/dream/entity/enums/GenderEnum.java index d0df6c3..c2889f0 100644 --- a/entity/src/main/java/hxy/dream/entity/enums/GenderEnum.java +++ b/entity/src/main/java/hxy/dream/entity/enums/GenderEnum.java @@ -2,13 +2,13 @@ package hxy.dream.entity.enums; import com.baomidou.mybatisplus.annotation.EnumValue; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonValue; -import lombok.Getter; + +import java.util.Arrays; +import java.util.Optional; public enum GenderEnum implements BaseEnum { - BOY(100, "男"), GIRL(200, "女"),UNKNOWN(0, "未知"); + BOY(100, "男"), GIRL(200, "女"), UNKNOWN(0, "未知"); @EnumValue//标记数据库存的值是code @@ -22,13 +22,19 @@ public enum GenderEnum implements BaseEnum { } - public static GenderEnum getEnumByCode(Integer code){ - for (GenderEnum genderEnum:values()){ - if (genderEnum.code.equals(code)){ - return genderEnum; - } + public static GenderEnum getEnumByCode(Integer code) { +// for (GenderEnum genderEnum:values()){ +// if (genderEnum.code.equals(code)){ +// return genderEnum; +// } +// } + Optional first = Arrays.stream(GenderEnum.values()).filter(item -> item.code().equals(code)).findFirst(); + if (first.isEmpty()) { + return null; + } else { + GenderEnum status = first.get(); + return status; } - return null; } @Override -- Gitee From 12813130c99013b49328b1a68b3623c7778a7b84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 16 May 2023 23:38:44 +0800 Subject: [PATCH 049/204] =?UTF-8?q?gradle=20tencent=E4=BB=A3=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++++++ SERIALIZE.md | 2 +- asset/img/gradle.png | Bin 0 -> 57148 bytes img.png => asset/img/jackson-date-format.png | Bin 4 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 asset/img/gradle.png rename img.png => asset/img/jackson-date-format.png (100%) diff --git a/README.md b/README.md index d6be950..ea2d45a 100644 --- a/README.md +++ b/README.md @@ -77,6 +77,15 @@ https://github.com/GradleCN/GradleSide ![](./asset/img/gradle-special-location.png) ![img.png](asset/img/gradle-wrapper.png) +腾讯的代理镜像 + +https://mirrors.cloud.tencent.com/gradle/gradle-7.5.1-bin.zip + +https\://services.gradle.org/distributions/gradle-7.4-bin.zip + +![img_1.png](asset/img/gradle.png) + + 技术 | 说明 | 官网 ----------------------|--------------------|-------------------------------------------------------------------------------------------------------------- Spring Boot | 容器+MVC框架 | [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot) diff --git a/SERIALIZE.md b/SERIALIZE.md index dc8aa4d..4c62d89 100644 --- a/SERIALIZE.md +++ b/SERIALIZE.md @@ -719,6 +719,6 @@ https://blog.csdn.net/zhuzhoulin/article/details/106758473 ### 配置文件 -![img.png](img.png) +![img.png](asset/img/jackson-date-format.png) diff --git a/asset/img/gradle.png b/asset/img/gradle.png new file mode 100644 index 0000000000000000000000000000000000000000..532579205765b5adfb7b7f1f125a7c905eff646a GIT binary patch literal 57148 zcmdpeRa{)n(i45;Sg;t?8U63dHmZ0VIRcO;=Q2H+0nzLr-Y+dehK@hWMqmLZ_aSY zKP4BkV!Zni_U&8k8dDVAnqc&?WJ=9n4!%~cvBn4>eaN^zb`-}U%_pWjKKFdc5%JSy6RLK! z5rk$j;3&RpVzSc2*0by?%DJr)nfRss2PM0kJ=bbU&ixRD2G7Opt!SrDP>yp457Add zie`veCK;Axjvj}dw;F#`$8|;U~6OB^WWNIeZbK+A+SaHoy-;7HjBWz ze=Y92r*B!z$C))EeDvJZ(bxg@YvlnfZ<+-{&6Xrs68w){AX1_rhKf@x?1IO1w%9!&Z{F5wHMQLQYX zgCz4#i&i~~G96oKk&7SE($2)ez|PlL;QH0*SSRULPr2@-_uZ(7QfvkZ*?U58OlxJk zx!9N=%Un_@UtZ<`*?vbt1qrv!Xhsc1&-{&wrJDEHKopzj=m0Bvec!*TUD-AcnvpHQ zl}+}ptG=BGG_sNuX1}UgA6p`z-J}+V3g4{Uw*!s<`Bh491BTY+k3wi3)FQksgfY7c zT5*_RzJz_mS&&31u7Q{7!J>hg$)@nDgM3`Oqcp$vlc^%_z4<1iyNTQB8e?e^b(~H# z7XHVd<`yPvrABfO4TZUe=0#46a+T^DsJ?VV4-za8KBo`K#XA>rQ0 z{YNRz&;QaE!+FYIA>yxV>jj(|2}x~-6)40|5#{7Qq1SsT=C3b_-7?uOeWUV_0Lh9tsW<+nHTv#uU$3w zqzk1^Lik$TA^@}u@wnc)3u25;n}5H9d=vIu8As;RXuWvON5?l_SL4$1qczSB1tGbg za3nAc_(P>FpL!VrgjJJcFErAcPo4~L1^oN>_&evYjTeWGVZ8pI$o^>Jd{KOR_wJVm z65hKA!mpw@_JDHxrpOs!4Ja~*TIktV$*1}9a)6Um>UYd9PGrSq^qDv-^;gH6|JN&g ziyJ#*Au?ey=(rBlLJ#r0d{}=StwV>7?IYn&7nbQ8>hbno*qcQ3C&u~A)N`K#Rw_42 zbHnP#7J1@b4f0Vy4(MD`0hLLtEM z*|YU$T6C;t--2o!C-Ag&w@1d`O-;vTnA$34+0V5FWn!`7%T|E{r4BC|kxxZv3p?Z$ z01qeT5@sr}xn@g_f-te(8f`=wWIc!h(Lbh2#|8;B?R<`% zr*SlVtRw5Y6$qZr7{raq^5akX3LtE6oi{HqYnNxh`TqIc^<-mlN=HFKVM}zM6W$){ zTf0B7+&*-iSA0xX*JHwuNo#;AuxxiPY}NFrbqMY)+gkcpKDc3}l>3O|{1_XV6Sl`V?sZQEC(-F1ob6H;f>3VKbnw38ft%PtH zy&CDZ@!{B8QXIPD;`5?iB<=AkB(d|Dxn9lnHuE;R`>f~_%m@v0z)jTizH;(#@!mU2 zGuOP#Z>~+0sEz}m`lO|j3X$1=_NDeP6xb)dh#I6VcxB)|sow3Jk}C7I@LK?fdnN{Y z^k_t+w~a{FzN7_wGa@yVr?9JT*WWWfIqqR?lX&Vr$vNQ3tmsgLtR4jSy`)c)7?jAv zazX&_wHnh!&QpxCwQRIHW?#*(ePLZJ=krIuLsc})CZp|k6ar0nZS`Kjhj;eLxc5Y; zS@2srI;}H|5Wu2=)45NIW~r{gphf|f?VY;}k1>gqjF@WzSny$r&Y`01cSY6J>3^wdNH@M? zve+{4Qq`nL<2LT+EHK~Nd8Jdays>pS;C@-N@beOW!)b}v@^h-fmId$?ur0X^%)vBs z>iTnTpo;xLKuFuFkN3=0jN*}(lZCA5qv3ow`enazz-~%xHrqAlX}n)MBz03x2~M2? zhn^e6ujk%Z3Zp9gJT8v%p)|#9@K+y|?8j=4j6}tVkVDf`FkUAD@dcFJ_~&1<>HWYu+i?DiFE=T`%9%-Mq0Pbb zFafQ%6#Yhy&5soy4tm^yK(7lBr_~=ET3)7jn0^Ygp?^VSU8tiE~dr#7U~A z#cr%9;ydY~2&)qbXrAo+n)ImQ&Y!2#^m|N% z1kK6n53!5;S-mN^NOS+bRzzU?W>lWs`rz)^apV3M>&>rqkVWqA9;^h9a9mM9-`zJz zI>? zwmuQMZX5{J3=v0Y@Itu}Vvmys@nj=X)yV|z`v=MiawmBV3sDPx(CRHZO#%FNzJ{Va zcxSFgSeN);VJ)Zd5w}Ur{lL+=bx%R|h0o`*M5o*`?q@O)HGd}V*2s;oZw{man@MO! zz8;Bq$ju)(2Vep2i)EjdpKzJB`7X)+R=!^T!f(@^RB7g~}W&6X>F{CX^1M{-&=E z<-?`S{p4BG%TC!MUdMZBXWiS}){A^Yn017@{KJsDRZ=;>mFmItpRhGr^~{#p$px6( zX%tZSYP>cxZZRLhM(+4wb`un+s^R; z##Wzp25K7P=@V=BRDKirOKZk85_MZ$b$r5xXPXMK^?QsW3mL@DvlL~Lx2_N;5#k9d z#amozNo|YG7=(%&LyBkz$>hGndWIQXd_PkI`9tfH@L5TjWo5_V+Kf&T*kyS)SV~bx z_h|CNz-g@p5XH{z2ZMlTZgDSa7}FU0?LAlLDs^ zVBrO_-uBN1OX5t;o$lBaqy^bMrU{$k@dDcK#F1N!ylAYwyzfto%l(;7J02Gh<5yQ> zX+Kfrd0Xz{KEJFkby1w3*xu*4^B1nHU6`TV7j#=2Dj1$A7}ntG8zm31Z1%+tt68XO zu7{M?m4yMHhrU!z25kXH|Lk-R&Gc`B70C`GYm_sEH5_ImX@$Oj4imvW9gTK>J6%y- zCtnIeD6nLu6W&j{S4s{p7SWqPR82O^3y=ExdN+M)LWYkXIBfvaP60A|q!-?#8gxr; z3o{?=3LnY*RQm@+C5{a3r|e_c?T;v2m+B9vMtenIfi^myx|nPz5kfWx_Yo>ljP2(G z6^T-g)1}dK9tqWM<9qroko3jGlD12yw)LMgM1^y*FR0oNC!W08>AWS0shgSFa9X7* z$HZl0vk`x&`an@nl*ov?nWaoqyj|&XT+qC%_&|kF3%cqivog8RCgAsFBRJbIR?Zq3 zq)=K41E`LW`R z`ZR3Gcl&Enx53VSmXePI%#kg=6pq(|qSMSPkzR$u_Y-o8ZBobna<&B=jH6_f5Tp?` z4$M?AtkAWu)(Fa=JNMu);#N+j3Lh@ z&04}+W5&4(^bpY5O%uW{w8>Sy$)~lwjNXvGYikSYyza|#NmtZFApThrggL>qBy*1U zR-ZTBH_t%8Hg9Y^yinm*l(r=wg1Nib6`?g=m#ekEx`=(y!+#ulUf>1&k^K}e=qELQ ze0566Jc6a4Bnq&N7q{{ttnXKeL*ilrrgL%wZ+ zjd=Nsp|wlZ#aFMuKeX)I3(&E#t>?6m z$1A^X17afk#jQ_K^ITCM%JX>ua!<28=P4>lVIiV3fijgGtaVIWr!dw`Al=mnb{Am0i^=ra@pF`)r| z5Fem1SmyO|c@#yvZFuFB9Pz?5q2UFy+ci%tB;5-no>yU=Y4MZ+%a)Q=^EEW*ukY3C z;)H~@=REED6g$LYs>S2qtO@YSIeS9MUfRZGq{-XJX~8>!!YB0e=XBY*wQMN22aWqi zwdQB+9Zejbf7sdF`HJh92f0?-=;fLu>tANJ`PgStBg?nJ9#l+61rAMninl_oD!(+% z*}f@Eoy*JINT}!JG_+V-nFo{EBu#DdjT1Gzimr@xB?(stmhDvaGVFa)?MuNC*i1i6 z0+p}NX}Ci~B6F96|9p?0AEB*LA4&gF=E)!s`;Gbh8HNZ^tsW6k(`8LLcV<33#nUYn zXers7>>rgs3mtwBB5NdzuGPr;gVwnjxk1^*AFbawcL+aj7#A3OO7~DqQAgS51vwQE zJg({L(b&FA^-;lM7;~P}eCfE+DZR-2&F~$f*^I?!8|9{W=}oG(7?+ZF+5BS#G_SFh zOTRAtZ1BS);BbygL4#$tT9FA``?%cqkDQa!iupvzp}p0y-^`wRq>cvhMN zmNVWIUX;8OyzboqTNkGdw96M0r&t0e1W92tTQkhk;1HU_&6(oSE1H26#R+){J!s?= znMOBWcM@|_S-S3N=)UE~pE(lUM@tJAhjTafDBtzt8UE}3ayci}(Kcd9c}v4AM{}Dp zNcvrEKqwv6LEX=(Ru>Q-=qR6*6I48R!QaZqeG=#7Y;)93em`7&m>-S1a|Z5}ss4V7 zC-ZwL{776_S%diEt7Z(ErO_-5f&PLaJ;Te9ASilyvA0i&y#S4nS40gRyDfhz+M^C5 z`e=6PL~Poyq>cKWxbpeAtmr1Q`aWp6)3CzLLUnwBymBY5zpz!NzOftjXjdK8Sy!#q z+TOm}z^M4k$ayE|uHB4kUZiplelZ_e(}!`i>@!X;fY%t5&PFd1lT@~G#y&e%C0~$> zYCxmYga>QnIy^71iDFl&AIS35QBH~otgV3=8=Xe~xIxq1hTPlrAW zs*@)=As!LPNUpYCKNt+laHT?Tnp_k;V~ z9o5&?Eb_gW`UC}rXF|E1E((glR)7K3$GXyT$Y)qVL3wWckkKv)Xv1F)acpDiul2RO z-7PPgQvY1XF3%IM=}lxj2R&1`E8dfngr!{zUStz0C{~&V85W#Wjr?ZG)o`o*R;Yv7 zaQE3|$MCF}puoR__fGBXRYVGP1Yz6-6F8Sg(V`B9c9{9 zbDj)*W1(=)J_B7wQ}{b`c(OJ7D2cZbwo&@~%^lWjXVS4|Jl!M+r}%P@(H>gBtw-d%lr!7@@H zs2j2n5}(D=YY(jDyW03PI;Jmm8$2SRd*80?efqukbhy>9E+HwsoY~m85sORq=d0X^ zIu45uTu}Equtt;5%$Vj)G~)W^!K(sgb4)m}c4LV6WwQt(Z4KK0>ra!BS3$nowXj?O zvF2@3go@CdxrNx0GiQvnuqF3?lDE@V<$!cgi2L^}k!7``jtsJXt$@b5oA&^k>T&nv z5{iJ@~;6O>e;*QV=>KgEK|H~dIn&(RiYo_xC zTJ0Hg*x($?fx_`>^Naw>gkpW;AHcmdQ%Y!k4J`F|xF9z|kLEP2qMqjvXHTDosGR72 zXqo+nqq1Etoms{;#be=*DdmBaXjkvI5>PoLqZbav~zr!dTPZ$^sEbA~Aexqz8v*aPrQr48F$Fx$8uPjf%M3 zk4-c%3Va`+R=uHPA9uOze z)hGMx{OmOljReE=hk}nchk+q%zblDELr^5oV$ ztB#Cp+Fb!#&p{q@K~6;78HP^MkrhB0ukputsr-HJY3OeD z*>zf-%e}~@YBf+Xi9`mP1n^Z7%B0Oko_Ixx(X=}rDy9r-yZ+6kILZ`vtu zN&6g*r=i@zTEj;mQR=QR=FcTV*;??uRKURQOW9)L>$9Ft@`MBMrx<{7=xcKEQ z%4!-DkCef~@z%m2w!IV?o|D?P=>uBs;WyJ>eL`gy^|OJL35$fWzcwZT5Kgk>`3kA^ z<$?m?NpU9lmh`VS@@3b9o5jB2gBJ97Bft}${wK>7fgrDGhfv%;3J*%dPO1&c0|11?Wyr$*& z>@9Sk+r30`FXCjsVK&7zV5eRf8DLb z&>_K};yH`61Y3u}W}5hVE}@F|))nOP1qQoJK7ui_EVYWgDz!_EYj(Hy2f#Erd32f_ zjh?n=#%9&VX64~^IXSFsDjQVi7wAz?AumOkZ(+Z2Z83!?AAJJmdLi5$h4E;-wVas; zkryWTqMgF>^`34$!YLyNa_*vPzP`y|nb$AEE2*RXxMK+&_(*G7HgJ;5AwEr*>hQIQ zJf=|`z1HHEC6JS9`knDkZ%!qhKLg@A{NZoRcB7n;c8Ou5as;>Ma=Qm%*nxfj8W!349%-0%|UJALyEs<5$<%7BS?i{ccRPJYXUmn0y|s4~t@uPrFp z&s=lk@5d{dn9;N}dH0kl)nBYG>efs6r@@N+$kX<$6(^~-AL>rFt{2}Prm2fK(d59i z9##_#oO7>%5;4@9@4hlasmgE8hYPk4BU@7L3NaYYJStrLocmR46Yga7u7jBi0%_Zj zOqGO}sxd8>@Pn;t#ft>$5W#u(@^Un z`rQvdOOg_YpGqAg%G(~&?yi;S^grnmke=}5U21}-BsS;bhsFAxz;J&k461OX)dKk_ z6-!GbF`dO(?>?AH3gk;#ZLwSA_eE3(_sJjV+uAZW0-jJMbx3(2e;D^p)HBzq_Q8@! zPQ?KtjkS{`g$rYw$z++1-`aZ~Rph_X8~Rzy=oL%RiSOJOkJ=0fYsR`azEWDL4-vDP z;qjQk%H~&?=mkBpAD%MGI#t-|)!Zzyb_sq=G67aXyx3bd-@*P$;`HBPih3;*3*&R% z5X9ZoR@5Bl>tV8TCZ5(_dlAWY!Qy&(x9!0bqtJPp;pl*Y6Al4!o_|amR-x&L=nQu^uf2zbqUvreB4K%S5)|qqdWpm^1s@W! zvgjU8S=gC52{vd>Ez+FNqH!0e{qsU^m$uhjG+}YeRXwQ0JgnffKb|9~i zvnOezB{p=wxK6X9OvNJD0jPYo^(6M!d?VxinDkV~yseGRmRB!szO}R5YYYD>`6jG7 z6fa`q_*8pwN^V)Hu;FRnPP|Er8mX8|uxJr++|v_NA%b8cCtt1dysv*ZGvwq{>wb

?W3 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

eKWJbl&cUlDD2B;L3>zS(TUk)+S;GI{Vkm{}P( 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 dfVI^A)Su&Btol5q?K5Zy#M9N!Wt~$(69B Date: Wed, 24 May 2023 21:50:18 +0800 Subject: [PATCH 050/204] =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=B8=BAnull?= =?UTF-8?q?=E7=9A=84=E6=97=B6=E5=80=99=EF=BC=8C=E7=9B=B4=E6=8E=A5=E5=BF=BD?= =?UTF-8?q?=E7=95=A5=E8=AF=A5=E5=AD=97=E6=AE=B5=E7=9A=84=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SERIALIZE.md | 28 +++++++++++++++++++++++++ app/src/main/resources/application.yml | 3 ++- asset/img/jackson-serialize-null.png | Bin 0 -> 138031 bytes 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 asset/img/jackson-serialize-null.png diff --git a/SERIALIZE.md b/SERIALIZE.md index 4c62d89..a6c3741 100644 --- a/SERIALIZE.md +++ b/SERIALIZE.md @@ -713,6 +713,34 @@ https://github.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample > https://www.cnblogs.com/xwzp/p/14685452.html +# @JsonInclude(Include.NON_NULL)全局配置 + +配置对象Field属性,当值为null的时候,就可以序列化忽略掉。 + +![img.png](asset/img/jackson-serialize-null.png) + +https://blog.csdn.net/u012477144/article/details/99731418 + +``` +spring.jackson.default-property-inclusion=non_null +``` +或者 + +```java +@Configuration +@EnableWebMvc +@Slf4j +public class WebMvcConfig extends WebMvcConfigurerAdapter { + + //@JsonInclude(Include.NON_NULL)全局配置 + @Override + public void configureMessageConverters(List> converters){ + Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() + .serializationInclusion(JsonInclude.Include.NON_NULL); + converters.add(new MappingJackson2HttpMessageConverter(builder.build())); + } +} +``` # 解决 redis 序列化 java8 LocalDateTime 问题 https://blog.csdn.net/zhuzhoulin/article/details/106758473 diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index 0a6ae30..1e2ab91 100755 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -21,6 +21,7 @@ spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 + default-property-inclusion: always # 当 NON_NULL 的时候,Field为null的时候,序列化可以忽略这个Field。不传给前端。 email: from: aohanhongzhi@qq.com @@ -30,7 +31,7 @@ mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: # 配置日志 -# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl local-cache-scope: statement # 每次执行sql。多个statement可能会在一个session里面。 这个是mybatis的一级缓存控制。 # default-enum-type-handler: org.apache.ibatis.type.EnumTypeHandler diff --git a/asset/img/jackson-serialize-null.png b/asset/img/jackson-serialize-null.png new file mode 100644 index 0000000000000000000000000000000000000000..9f585605ac6e327321eb52fdd590b3039557695b GIT binary patch literal 138031 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�xe2Yv;C9xPpB2T7s>0kY8I{lFbEeOYPl`!G!Tj77! zN|Ki{&Wssr{C@ZNVP6?#7GNGOQYv($|2Z^a(3N`lmG=lwY?z3C_Zq*=# zD`)?Kx>HNB^^8hDw$Q*>xc76dAkg<#w7~LDA2Grrp#?o>yG2D=9l`f+ltqu6&019= z^ukl7eyXI`5eS!tzU)w^LJ{^Fdo!=N(==%E(kcxdEQy%)J284n~k@GNr^^dmK4m-JAs+ z^U$doBG^31%-$C4$&vqlresUK9a_M>i`V`7_%T}C=89_VGdH#TEB4W002EJur;MW- z*L~YWH7@g~BxVL*&Q-GRadKcwYSJ_p14CTT@Pm6v1U-Ebk4yo@*DNH=hP16NHH{4< z0>U@RZ8}taf#dBbz?5(Frhi!?DWM2^JyGpe z=OF69QU;p6X^g3j^PV=1ngklO}TL?y{v3`tK!C8V&f| zo?eAuizJSCN+PiHNk)#KbQ3K>2I^xp_S#)msR=C`agc#-d>s`77A;%25)r*b0{7Ra zHX1!(UT)HjybfME(rE8$K8IJk3KT8O+3r4=5+3|%)rX5oWoqVy zR=yal?Xf>fZ(wEKlQ)2lAHSzRcC^&bi?ziF_waeE6<3<_H<_hJbM#_(VuhNO4oq(C z0k1!M9=ZC9*v>IQkJ_x|2H1@o28-H+ti~Oxq_CGfW4@ahM@I7k-f7n9Z*1-*6DozyF6$zM+Q-uPW5C4T#R!88`3I3R4Q&1uRqb&x0 z{+BxeV2#LY=-1q0NY%d#Y@psS>sE~?A{eQX~f0@K~USoc}2_7LM*#EiI zFg@={xT_j_xv+)kX))<`!Z}-#Ifqy|8D9x0Vtnu=;FfAw%ii+ic6e~_zksDK-Ejj} zb%}ZaAR*o(!C8Zw)^$~su&3m(i~j0-)LF_8W@65lId_955GdlCTs=SnjExzW)ZtI5 zI;bLW(*v^?KMIiwD%<=hPn~-01EkpT7@h;!^|2Wk$iy|5Ck_zjM#()mF(A2TL^l3{ zG7V2cOK;yJ!!b@tIqUy~7D}Y_OaLk}-}^@c-S$E#??watw94=8<;3&+7^kDP z9!z=xS=HQ{06PdVQuk|H2q7C+;#8Yh^UsAk`-QxuH{3&6!~8WiZSiGpTRzu9p7%CO z+gkOf^7E2zK+$EU@}W1xR-cV8v80v9(?avPQ;e#>Bi>D<@l;+;LX+qwmNysfU80g3 zVgE0X^64j8<AIanQ)<~!yF&T34hKig`Ty$u8Ezzn@qQwpF^GlAo3GiI z+p9fV@U2zr(zn{qAxXoQ+-r{-&>X#kz`uuEKS+d{na!gN0|Pu_vh1o z_(#8cmcLV#8&5mGDDS0ycTwL$wEK2b#ws$vaubU4C}#aU^v^cu7+~b-BB5M%Qa>aQ ziq~G*Tb^bl4!VP~j~!qX80^CSz97d;-uc7Tbk6bN8zFXp8?-T-XQkQ2Rc$y-%8){( zWDHlm#6&zhNjCby<+oZL5BqGt`2s`r8nwB19b=Y%j(q49Q9+G^R%*9MsZ{pXL(UK& zI|c*I5!yqNLY9svMC7`+3hYH|;yEawAvUj9-JpIvW=#SK)y2w`hT7SezbNK9>YFQ9 z23aKYHP5mqZ-}RX_`<#u!nYS5J{%LBVsO>LG{1T+vqj-FRaZnsa0XC0y;X@VfXE@n z@5r`qU<&-r$=$3u`lYIIZk)xp0=gUNj9ZQaR@5g+KwioQ0~EJ_vcMt^Cor*tQvXLv z+&9e3b}<%L%ozMFQE}>XZ`*e|Y1HJSt|>%sj*O|aWt(I2cKEsl;N9hBC)n60!X`t# zEA=L<{Qhwn4TKzW>HuBFCUY0Jc|V1ljM>vGh+M}K1|6rigX=eR|GDr^!&!UtMg3=+w)Hgk|A;F zIHyhEw$S$9gAFLC{OU7wjE*4v!W$Ln86L7@T~WaTNb`X}u@s5mHOmc`c8u>J3MyV9>{?UlaJf%)HWWB1&^t6_6hCO*Wuk01ECQygXWw&v)ppQD2Q`3_$q zH}>L5%O-4z){yYs8}30H1{QnA?dKk}A%r|iuuW@iCR@y^N;;5Z`jVj4iC}Re3pPO) z+URGmzYKQpsN~XV+pJ*jhZ@99yrvHRdJz@DpNo$>kv&wKC7y}aw+E1Ec1!g z@4KIZ1-Oi9oI}T$*=UTSdx!I%_3CgjF%Y?@omS32d%K4P%;dF{%BNH7p@5W;%XmSh zXV{U+V!mf8GXbO!=p)1hu)9iQrF$kM@8ynP=uF-5A4>vGNLDEnjJ46ysF^Y`1Hl2`R7GU zA0UWNp*{nw5I#zmS_~oCPA|b*9~7-r-3sWhT5^@JzxxMooHx@U7M+-_<C4_9FT?$JAP&ei?T6BIG`vOSAGErv_!TEuUS*)y6!ewA0f^Nv#>fk z_XrkJbAD)!q#`2DT+MLT6%z8CXYjoi$e3MNvt;8@p;fNczhKXPJ^*`S5Cb(CGX0i~M>rq}Xrt?d~VPs@*k=kTu;Hv%w;#c5i=rpP9BR%=2LS zDK3{v$>NT)!#vU0VM>>&B?#PpDFuM2B)rM00+@ygwj)9Qt2*&9DLfax?eYzRfS93k z!PcK5Bd+L}N`HY-_iup5?$zb_2TF*b1>BYhsTmI~u(U@=BZJr8p5S17{R>vWi&N8F z&A_2|1sc1wfGWr&8Zg`h{fk|n_v(4a=Q#ff7~)&#V1z7cim$$%+91ogr{_Q%ii@KM z?rH=HoHSmh8u_o-U2Wm^Y|fs@XxprE&tlk{#b0uCCt-W@5fpIOGA;Uz4VznGG}%%7 z8Pn7HQjKeT;jF713QogzV~E8WxzUe_(<;cMGO*IXqEs~GRalGc7$O>W(ZT3P9Zh3-xT+ls|OE3mHOyUJ6LUc+#FPHcbU_+>7aN5k)U zym^y+CD9)fmhHDX)Z4_xfwM5MC?V*cedGh%TwuY1`N=_$in`|+Qeyu3crf0cK2Mz6 z;+jJI{jB|rT&g`D|GRnjk5nc*E#oEqv5;U&64zB$S-Aks$T$}A=rOG#xVsYF@2&P+ zrsdE`lM|Px$Wk+Z=jUP8eb~vdy2$(G9=&tg5B2`Si-f27&;rM8`#e^{s=xsy0%zGp z@;rEFbrCJixX4V&^$D)rn(Q0iQ>jMC!52J*;6ic5h=bRA*DvXqmRqtoVfi97>D*4D zkT9R}f?K^b^ZooMZ+fk!Ru4Sm87&Z?B*8#ZNhzMksn_28td$h3=RZviuDnFK#yJz! z2Fd20W|RyvzSK7T-sm|;#7z0CgOB8`hOBAKf^_)Lqk_~-$T-22+5JfHdOC{OX18n9hzs7S4WNaPcFHz<|?3jIGFEh`5yL9X?S+&54yhp*v zN1Gd#Z9O!w+FPu`z#f9Ks=lKgDPgu+@iMt?|F2tfp*; zJIj+1^;4s-Z{M`GqAPP#WBjX3PkfQ|3RH@C{% z22(-M%foDES8osbDK+W~cp-(&s%a5<;X+sloZ|BRg&={pb&dOez>)G_R zDRC(VszrZGJ(d!xn?7Ch>IE#+U!R77%LW#ZUq+ zF5JB>sbXo9ZiVDoir>ZIa@zKsSn)M*EkXS6gF#S{L~C zoxAxuGu7=2u;8{{e)>kIE5Fx%Z7wsjXV2Hv1Sr3mQdK1g^aEp72kPxQ(Bt8T*=CcX|vm2@rScLn%=K7DGH@*C=_GI zw8zb2SW%$ymo)7$T}b|1o$@V0+cWc}VURv7I^W5P4y&yUIQBr-y_(;>e;;m{3**n KldAx~4E`VISfd93 literal 0 HcmV?d00001 -- Gitee From c849cca668e181adbeabcdd3363ade48ff8da4b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 26 May 2023 15:07:40 +0800 Subject: [PATCH 051/204] =?UTF-8?q?java.sql.Date=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=88=B3=E4=B8=8Eyyyy-MM-dd=E6=A0=BC=E5=BC=8F=E7=A0=94?= =?UTF-8?q?=E7=A9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SERIALIZE.md | 24 +++++++ .../test/java/hxy/dream/util/JacksonTest.java | 69 +++++++++++++++++++ .../serializer/SqlDateJsonSerializer.java | 22 ++++++ .../java/hxy/dream/entity/dto/UserDTO.java | 13 +++- 4 files changed, 125 insertions(+), 3 deletions(-) create mode 100644 app/src/test/java/hxy/dream/util/JacksonTest.java create mode 100644 common/src/main/java/hxy/dream/common/serializer/SqlDateJsonSerializer.java diff --git a/SERIALIZE.md b/SERIALIZE.md index a6c3741..7bed77c 100644 --- a/SERIALIZE.md +++ b/SERIALIZE.md @@ -713,6 +713,27 @@ https://github.com/baomidou/mybatis-plus-samples/tree/master/mybatis-plus-sample > https://www.cnblogs.com/xwzp/p/14685452.html + +java.sql.Date的序列化,默认是转成时间戳。默认序列化器:com.fasterxml.jackson.databind.ser.std.SqlDateSerializer + +https://blog.csdn.net/weixin_44299027/article/details/104516280 + +```java + // 修改配置即可。从com.fasterxml.jackson.databind.ser.std.SqlDateSerializer源代码看出来的。 没必要自定义一个序列化器。 + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false); +``` + +java.sql.Date与java.util.Date的两者区别: + +区别: +java.util.Date:年月日 时分秒 +java.sql.Date:年月日 + +联系: +`java.sql.Date(子类) extends java.util.Date (父类 + + + # @JsonInclude(Include.NON_NULL)全局配置 配置对象Field属性,当值为null的时候,就可以序列化忽略掉。 @@ -750,3 +771,6 @@ https://blog.csdn.net/zhuzhoulin/article/details/106758473 ![img.png](asset/img/jackson-date-format.png) +### 序列化作用顺序 + +全局配置的大于单个注解,测试 [hxy.dream.util.JacksonTest.testSqlDate](app/src/test/java/hxy/dream/util/JacksonTest.java) \ No newline at end of file diff --git a/app/src/test/java/hxy/dream/util/JacksonTest.java b/app/src/test/java/hxy/dream/util/JacksonTest.java new file mode 100644 index 0000000..207a585 --- /dev/null +++ b/app/src/test/java/hxy/dream/util/JacksonTest.java @@ -0,0 +1,69 @@ +package hxy.dream.util; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.module.SimpleModule; +import hxy.dream.common.serializer.SqlDateJsonSerializer; +import hxy.dream.entity.dto.UserDTO; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Date; + +/** + * @author eric + * @description + * @date 2023/5/26 + */ +public class JacksonTest { + + private static final Logger log = LoggerFactory.getLogger(JacksonTest.class); + + @Test + public void testDateSerialization() throws Exception { + + Date date = new Date(122, 5, 23); + + String string = date.toString(); + log.info("{}", string); + + + ObjectMapper objectMapper = new ObjectMapper(); + SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(Date.class, new SqlDateJsonSerializer()); + objectMapper.registerModule(simpleModule); + String s = objectMapper.writeValueAsString(date); + log.info("{}", s); + + } + + @Test + public void testSqlDate() throws Exception { + + UserDTO userDTO = new UserDTO(); + userDTO.setId(1); + userDTO.setName("test"); + + // 看Date的序列化 + userDTO.setRegisterDate(new Date(110, 1, 1)); + + // 自定义序列化器 + ObjectMapper objectMapper = new ObjectMapper(); + if (false) { + // 这里相当于全局配置 + SimpleModule simpleModule = new SimpleModule(); + simpleModule.addSerializer(Date.class, new SqlDateJsonSerializer()); + objectMapper.registerModule(simpleModule); + } + + // 修改配置即可。从com.fasterxml.jackson.databind.ser.std.SqlDateSerializer源代码看出来的 + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false); + + String s = objectMapper.writeValueAsString(userDTO); + log.info("{}", s); + + } + + +} diff --git a/common/src/main/java/hxy/dream/common/serializer/SqlDateJsonSerializer.java b/common/src/main/java/hxy/dream/common/serializer/SqlDateJsonSerializer.java new file mode 100644 index 0000000..97de29e --- /dev/null +++ b/common/src/main/java/hxy/dream/common/serializer/SqlDateJsonSerializer.java @@ -0,0 +1,22 @@ +package hxy.dream.common.serializer; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.sql.Date; + +/** + * 建议直接配置 objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false); + * true 就是时间戳,false就是 正常日期 + */ +@Deprecated +public class SqlDateJsonSerializer extends JsonSerializer { + + @Override + public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + jsonGenerator.writeString("时间格式化" + date.toString()); + } + +} \ No newline at end of file diff --git a/entity/src/main/java/hxy/dream/entity/dto/UserDTO.java b/entity/src/main/java/hxy/dream/entity/dto/UserDTO.java index 00b72fd..45d6183 100644 --- a/entity/src/main/java/hxy/dream/entity/dto/UserDTO.java +++ b/entity/src/main/java/hxy/dream/entity/dto/UserDTO.java @@ -1,15 +1,22 @@ package hxy.dream.entity.dto; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; +import java.sql.Date; + @Data public class UserDTO implements DTO { - String id; + Integer id; // GenderEnum gender; + public String name; + +// @JsonFormat(pattern = "yyyy-MM-dd", locale = "zh", timezone = "GMT+8") // 这里就是单个注解的配置 + public Date registerDate; + @Override public String dto() { - - return id; + return ""; } } -- Gitee From d88f0e72fb3492a41b35c6cc26e1d4adfad29e87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 26 May 2023 15:17:31 +0800 Subject: [PATCH 052/204] bump springboot from 3.0.1 to 3.1.0 --- build.gradle | 2 +- dao/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 6aa0eb5..416006e 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.0.1' + springBootVersion = '3.1.0' } repositories { mavenLocal() diff --git a/dao/build.gradle b/dao/build.gradle index ad91eb5..9f3af8c 100644 --- a/dao/build.gradle +++ b/dao/build.gradle @@ -12,7 +12,7 @@ dependencies { api project(':entity') /* 子模块之间的依赖 */ // mysql的驱动版本应该是受啥控制了,可以忽略版本号,后期可以调查下,通过依赖分析目前没有找到原因 - runtimeOnly 'mysql:mysql-connector-java' + runtimeOnly 'mysql:mysql-connector-java:8.0.33' testImplementation group: 'junit', name: 'junit', version: '4.12' } -- Gitee From 260aad655dd1f17eb72f4ce9e3eeb7b8b0286f6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 26 May 2023 15:29:56 +0800 Subject: [PATCH 053/204] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E4=BE=9D=E8=B5=96?= =?UTF-8?q?=EF=BC=8C=E6=95=B4=E7=90=86=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- app/src/main/resources/logback-spring.xml | 66 ++++----- asset/logback-dev.xml | 4 +- common/build.gradle | 4 +- .../extend/LogbackDingTalkAppender.java | 136 +++++++++--------- dao/build.gradle | 2 +- entity/build.gradle | 4 +- 7 files changed, 110 insertions(+), 108 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index de0e01d..8bda4a3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,5 +7,5 @@ bootJar.enabled = true dependencies { api project(':common') - testImplementation group: 'junit', name: 'junit', version: '4.12' + testImplementation group: 'junit', name: 'junit', version: '4.13.2' } diff --git a/app/src/main/resources/logback-spring.xml b/app/src/main/resources/logback-spring.xml index 5f7a6bd..e25411e 100644 --- a/app/src/main/resources/logback-spring.xml +++ b/app/src/main/resources/logback-spring.xml @@ -23,8 +23,8 @@ - - + + @@ -37,16 +37,14 @@ ${LOG_PATH}/all.log - + ${LOG_PATH}/all.%d{yyyy-MM-dd}.%i.log - - 180 + + 10MB + 60 - - - 10MB - + 200MB %date %level [%thread] %logger{36} [%file : %line] %msg%n @@ -63,16 +61,14 @@ ${LOG_PATH}/debug.log - + ${LOG_PATH}/debug.%d{yyyy-MM-dd}.%i.log - - 180 + + 10MB + 60 - - - 10MB - + 200MB %date %level [%thread] %logger{36} [%file : %line] %msg%n @@ -88,15 +84,17 @@ DENY ${LOG_PATH}/info.log - + + ${LOG_PATH}/info.%d{yyyy-MM-dd}.%i.log - 180 - - 10MB - + + 10MB + 60 + + 200MB - %date %level [%thread] %logger{36} [%file : %line] %msg%n + %date %level [%thread] %class.%method \(%file : %line\) %msg%n @@ -106,12 +104,14 @@ DENY ${LOG_PATH}/warn.log - + + ${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log - 180 - - 10MB - + + 10MB + 60 + + 200MB %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger -%msg%n @@ -125,12 +125,14 @@ DENY ${LOG_PATH}/error.log - + + ${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log - 180 - - 10MB - + + 10MB + 60 + + 200MB %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread]%logger -%msg%n diff --git a/asset/logback-dev.xml b/asset/logback-dev.xml index adee638..0572dd7 100755 --- a/asset/logback-dev.xml +++ b/asset/logback-dev.xml @@ -15,8 +15,8 @@ - - + + diff --git a/common/build.gradle b/common/build.gradle index 7e26b0a..88bd658 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -15,12 +15,12 @@ repositories { dependencies { api project(':dao') /* 子模块之间的依赖 */ - api 'com.ejlchina:okhttps-jackson:3.4.0' + api 'com.ejlchina:okhttps-jackson:3.5.3' api 'org.springframework.boot:spring-boot-starter-mail' implementation 'org.springframework.data:spring-data-redis' implementation 'redis.clients:jedis' - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.10.3' + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.0' implementation group: 'org.javassist', name: 'javassist', version: '3.27.0-GA' implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.6' diff --git a/common/src/main/java/hxy/dream/common/extend/LogbackDingTalkAppender.java b/common/src/main/java/hxy/dream/common/extend/LogbackDingTalkAppender.java index b608e0b..c6667b9 100644 --- a/common/src/main/java/hxy/dream/common/extend/LogbackDingTalkAppender.java +++ b/common/src/main/java/hxy/dream/common/extend/LogbackDingTalkAppender.java @@ -1,68 +1,68 @@ -package hxy.dream.common.extend; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.core.UnsynchronizedAppenderBase; -import com.ejlchina.okhttps.HTTP; -import com.ejlchina.okhttps.OkHttps; -import com.ejlchina.okhttps.jackson.JacksonMsgConvertor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.util.concurrent.ConcurrentHashMap; - -/** - * @author eric - * @program inspector-server - * @description 错误消息发送到钉钉上 - * @date 2021/10/28 - */ -@Component -public class LogbackDingTalkAppender extends UnsynchronizedAppenderBase { - - private static final Logger log = LoggerFactory.getLogger(LogbackDingTalkAppender.class); - private HTTP http = HTTP.builder() - .baseUrl("http://easyprint.vip:9090/") - .addMsgConvertor(new JacksonMsgConvertor()) - .build(); - - @Value("spring.profiles.active") - String activeProfile; - - @Override - protected void append(ILoggingEvent eventObject) { - Level level = eventObject.getLevel(); - - if (activeProfile == null || activeProfile.contains("dev") || activeProfile.contains("test")) { - if (level.toInt() == Level.ERROR_INT) { - log.debug("\n====>当前是本地测试环境,错误信息不通知钉钉"); - } - return; - } - switch (level.toInt()) { - case Level.ERROR_INT: - // 发送到钉钉 - ConcurrentHashMap postBody = new ConcurrentHashMap<>(); - long timeStamp = eventObject.getTimeStamp(); - - // 专属业务日志名字,不同业务响应等级划分 - String loggerName = eventObject.getLoggerName(); - String msg = String.format("时间:%s,级别:%s,原因%s", timeStamp, eventObject.getLevel(), eventObject.getFormattedMessage()); - postBody.put("title", loggerName); - postBody.put("msg", msg); - String s = http.async("api/dingtalk/v1/notice").setBodyPara(postBody).bodyType(OkHttps.JSON).post().getResult().getBody().toString(); - log.debug("钉钉返回信息{}", s); - break; - case Level.WARN_INT: - case Level.INFO_INT: - // -// log.info("发送日志信息到钉钉" + eventObject); - break; - default: - // 默认处理 - } - - } -} +//package hxy.dream.common.extend; +// +//import ch.qos.logback.classic.Level; +//import ch.qos.logback.classic.spi.ILoggingEvent; +//import ch.qos.logback.core.UnsynchronizedAppenderBase; +//import com.ejlchina.okhttps.HTTP; +//import com.ejlchina.okhttps.OkHttps; +//import com.ejlchina.okhttps.jackson.JacksonMsgConvertor; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.stereotype.Component; +// +//import java.util.concurrent.ConcurrentHashMap; +// +///** +// * @author eric +// * @program inspector-server +// * @description 错误消息发送到钉钉上 +// * @date 2021/10/28 +// */ +//@Component +//public class LogbackDingTalkAppender extends UnsynchronizedAppenderBase { +// +// private static final Logger log = LoggerFactory.getLogger(LogbackDingTalkAppender.class); +// private HTTP http = HTTP.builder() +// .baseUrl("http://easyprint.vip:9090/") +// .addMsgConvertor(new JacksonMsgConvertor()) +// .build(); +// +// @Value("spring.profiles.active") +// String activeProfile; +// +// @Override +// protected void append(ILoggingEvent eventObject) { +// Level level = eventObject.getLevel(); +// +// if (activeProfile == null || activeProfile.contains("dev") || activeProfile.contains("test")) { +// if (level.toInt() == Level.ERROR_INT) { +// log.debug("\n====>当前是本地测试环境,错误信息不通知钉钉"); +// } +// return; +// } +// switch (level.toInt()) { +// case Level.ERROR_INT: +// // 发送到钉钉 +// ConcurrentHashMap postBody = new ConcurrentHashMap<>(); +// long timeStamp = eventObject.getTimeStamp(); +// +// // 专属业务日志名字,不同业务响应等级划分 +// String loggerName = eventObject.getLoggerName(); +// String msg = String.format("时间:%s,级别:%s,原因%s", timeStamp, eventObject.getLevel(), eventObject.getFormattedMessage()); +// postBody.put("title", loggerName); +// postBody.put("msg", msg); +// String s = http.async("api/dingtalk/v1/notice").setBodyPara(postBody).bodyType(OkHttps.JSON).post().getResult().getBody().toString(); +// log.debug("钉钉返回信息{}", s); +// break; +// case Level.WARN_INT: +// case Level.INFO_INT: +// // +//// log.info("发送日志信息到钉钉" + eventObject); +// break; +// default: +// // 默认处理 +// } +// +// } +//} diff --git a/dao/build.gradle b/dao/build.gradle index 9f3af8c..5e825dd 100644 --- a/dao/build.gradle +++ b/dao/build.gradle @@ -13,6 +13,6 @@ dependencies { // mysql的驱动版本应该是受啥控制了,可以忽略版本号,后期可以调查下,通过依赖分析目前没有找到原因 runtimeOnly 'mysql:mysql-connector-java:8.0.33' - testImplementation group: 'junit', name: 'junit', version: '4.12' + testImplementation group: 'junit', name: 'junit', version: '4.13.2' } diff --git a/entity/build.gradle b/entity/build.gradle index 9d5f50f..3d18a72 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,8 +8,8 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-boot-starter:3.5.3' - api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0' + api 'com.baomidou:mybatis-plus-boot-starter:3.5.3.1' + api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.1' api 'org.springframework.boot:spring-boot-starter-validation' api 'jakarta.annotation:jakarta.annotation-api:2.1.1' -- Gitee From 4150f434e12ab01dff6a7160c685b3b847ba2713 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 26 May 2023 15:36:09 +0800 Subject: [PATCH 054/204] implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.19' bump --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 88bd658..ae65d9e 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -23,7 +23,7 @@ dependencies { implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.0' implementation group: 'org.javassist', name: 'javassist', version: '3.27.0-GA' - implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.6' + implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.19' implementation 'org.redisson:redisson:3.15.0' // https://cnblogs.com/keeya/p/13846807.html -- Gitee From 730e14ab64106937786eef75b708e97eff04f6f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 26 May 2023 16:55:27 +0800 Subject: [PATCH 055/204] =?UTF-8?q?=E4=B9=B1=E7=A0=81=E6=B2=A1=E6=9C=89?= =?UTF-8?q?=E5=A4=8D=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/hxy/dream/app/controller/SystemController.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/hxy/dream/app/controller/SystemController.java b/app/src/main/java/hxy/dream/app/controller/SystemController.java index 0c9d6e4..42012b9 100644 --- a/app/src/main/java/hxy/dream/app/controller/SystemController.java +++ b/app/src/main/java/hxy/dream/app/controller/SystemController.java @@ -31,6 +31,12 @@ public class SystemController { } log.info("{}", Thread.currentThread().getName()); - return BaseResponseVO.success("SpringBoot"); + return BaseResponseVO.success("SpringBoot项目工程"); } + + @GetMapping("encoding") + public String encoding() { + return "encoding text/plain, 中文应该是乱码的。 Content-Type:text/html;charset=UTF-8就不会乱码 "; + } + } -- Gitee From e4f58b481badbe1d9339349187f748fd749e7454 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 26 May 2023 16:58:51 +0800 Subject: [PATCH 056/204] =?UTF-8?q?=E8=BF=94=E5=9B=9E=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=88=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SERIALIZE.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/SERIALIZE.md b/SERIALIZE.md index 7bed77c..03f850c 100644 --- a/SERIALIZE.md +++ b/SERIALIZE.md @@ -723,6 +723,32 @@ https://blog.csdn.net/weixin_44299027/article/details/104516280 objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false); ``` +或者可以试试 + +https://blog.csdn.net/qq_21567385/article/details/107303684 + +```yaml +spring: + jackson: + # 返回时间戳 + serialization: + write-dates-as-timestamps: true +``` + +```yaml +spring: + jackson: + # 格式化返回时间 yyyy-MM-dd HH:mm:ss + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 +``` + +个别注解配置太繁琐 + +```java +@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8") +``` + java.sql.Date与java.util.Date的两者区别: 区别: -- Gitee From 38d481c88a4b4c09d99e33c30c4d0515aa51289f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 26 May 2023 22:35:41 +0800 Subject: [PATCH 057/204] =?UTF-8?q?=E5=AD=97=E7=AC=A6=E9=9B=86=E4=B9=B1?= =?UTF-8?q?=E7=A0=81=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuration/BaseWebMvcConfig.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 common/src/main/java/hxy/dream/common/configuration/BaseWebMvcConfig.java diff --git a/common/src/main/java/hxy/dream/common/configuration/BaseWebMvcConfig.java b/common/src/main/java/hxy/dream/common/configuration/BaseWebMvcConfig.java new file mode 100644 index 0000000..307d381 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/configuration/BaseWebMvcConfig.java @@ -0,0 +1,37 @@ +package hxy.dream.common.configuration; + +import org.springframework.context.annotation.Configuration; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; + +import java.nio.charset.StandardCharsets; +import java.util.List; + +@Configuration +public class BaseWebMvcConfig extends WebMvcConfigurationSupport { + @Override + protected void extendMessageConverters(List> converters) { + for (HttpMessageConverter converter : converters) { + // 解决controller返回普通文本中文乱码问题 + if (converter instanceof StringHttpMessageConverter) { +// ContentType: text/html,Chaset=UTF-8 + ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8); + } + // 解决controller返回json对象中文乱码问题 +// if (converter instanceof MappingJackson2HttpMessageConverter) { +// ((MappingJackson2HttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8); +// } + } + } + + @Override + public void configurePathMatch(PathMatchConfigurer configurer) { + //setUseSuffixPatternMatch 后缀模式匹配 + configurer.setUseSuffixPatternMatch(true); + + //setUseTrailingSlashMatch 自动后缀路径模式匹配。尾斜杠默认不被支持,如果没有显式指定将返回404。 + configurer.setUseTrailingSlashMatch(true); + } +} -- Gitee From 4fb13695a5f463000a4c713a997966eb2662ea41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 26 May 2023 22:48:02 +0800 Subject: [PATCH 058/204] =?UTF-8?q?=E5=BA=8F=E5=88=97=E5=8C=96=E7=9A=84?= =?UTF-8?q?=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- asset/java/WebMvcConfiguration.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/asset/java/WebMvcConfiguration.java b/asset/java/WebMvcConfiguration.java index 2fcbdfd..2cac413 100644 --- a/asset/java/WebMvcConfiguration.java +++ b/asset/java/WebMvcConfiguration.java @@ -11,6 +11,9 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter import java.util.List; +/** + * 这个只是配置了 SpringMVC那一层,此外还有对外的MQ消息啥的,其他使用jackson序列化redis啥的 + */ @EnableWebMvc @Configuration public class WebMvcConfiguration extends WebMvcConfigurerAdapter { -- Gitee From 6ae26b0f8cf0a4b48dbd70bbba43f965f32aded3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 26 May 2023 22:54:07 +0800 Subject: [PATCH 059/204] =?UTF-8?q?=E5=85=A8=E5=B1=80=E4=B8=8ESpringMVC?= =?UTF-8?q?=E5=B1=82=E7=9A=84=E5=8C=BA=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SERIALIZE.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/SERIALIZE.md b/SERIALIZE.md index 03f850c..8e7cc72 100644 --- a/SERIALIZE.md +++ b/SERIALIZE.md @@ -769,8 +769,9 @@ java.sql.Date:年月日 https://blog.csdn.net/u012477144/article/details/99731418 ``` -spring.jackson.default-property-inclusion=non_null +spring.jackson.default-property-inclusion=non_null #这个应该是全局的 ``` + 或者 ```java @@ -779,7 +780,7 @@ spring.jackson.default-property-inclusion=non_null @Slf4j public class WebMvcConfig extends WebMvcConfigurerAdapter { - //@JsonInclude(Include.NON_NULL)全局配置 + //@JsonInclude(Include.NON_NULL) SpringMVC层的配置(也不算全局配置,估计不影响redis啥的Jackson序列化啥的) @Override public void configureMessageConverters(List> converters){ Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() -- Gitee From a2e4aaed6de17cd0a1f45f7dd00f03605a05459a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 31 May 2023 19:21:12 +0800 Subject: [PATCH 060/204] =?UTF-8?q?=E8=BF=99=E4=B8=AA=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E5=99=A8=EF=BC=8C=E5=8F=AF=E4=BB=A5=E5=8E=BB=E6=8E=89=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=8F=82=E6=95=B0=E9=87=8C=E7=9A=84"null"=E5=80=BC?= =?UTF-8?q?=E3=80=82=E3=80=90=E8=85=BE=E8=AE=AF=E6=96=87=E6=A1=A3=E3=80=91?= =?UTF-8?q?SpringMVC=E5=AD=A6=E4=B9=A0=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20https://docs.qq.com/doc/?= =?UTF-8?q?DeXNEanBlc09MWG9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/configuration/WebMvcConfig.java | 2 ++ .../converter/StringToStringConverter.java | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java diff --git a/common/src/main/java/hxy/dream/common/configuration/WebMvcConfig.java b/common/src/main/java/hxy/dream/common/configuration/WebMvcConfig.java index 618da7e..41bfb45 100644 --- a/common/src/main/java/hxy/dream/common/configuration/WebMvcConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/WebMvcConfig.java @@ -3,6 +3,7 @@ package hxy.dream.common.configuration; import hxy.dream.common.converter.IntegerCodeToEnumConverterFactory; import hxy.dream.common.converter.StringCodeToEnumConverterFactory; import hxy.dream.common.converter.StringToDateConverterFactory; +import hxy.dream.common.converter.StringToStringConverter; import org.springframework.context.annotation.Configuration; import org.springframework.format.FormatterRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @@ -23,6 +24,7 @@ public class WebMvcConfig implements WebMvcConfigurer { */ @Override public void addFormatters(FormatterRegistry registry) { + registry.addConverter(new StringToStringConverter()); registry.addConverterFactory(new IntegerCodeToEnumConverterFactory()); registry.addConverterFactory(new StringCodeToEnumConverterFactory()); registry.addConverterFactory(new StringToDateConverterFactory()); diff --git a/common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java b/common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java new file mode 100644 index 0000000..7da3383 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java @@ -0,0 +1,27 @@ +package hxy.dream.common.converter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.convert.converter.Converter; + +/** + * 这个转换器,可以去掉前端参数里的"null"值。 + * 【腾讯文档】SpringMVC学习 + * https://docs.qq.com/doc/DeXNEanBlc09MWG9C + *

+ * GET {{host}}/file/list?pageNum=1&pageSize=20&searchValue=null + * 等于下面这个 + * GET {{host}}/file/list?pageNum=1&pageSize=20&searchValue= + */ +public class StringToStringConverter implements Converter { + private static final Logger log = LoggerFactory.getLogger(StringToStringConverter.class); + + @Override + public String convert(String source) { + log.info("convert source: {}", source); + if (source != null && "null".equals(source.toLowerCase()) || !"nil".equals(source)) { + return ""; + } + return source; + } +} -- Gitee From a4fba2a6717c067a21e9b735fa207aa214be08d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 31 May 2023 20:07:02 +0800 Subject: [PATCH 061/204] =?UTF-8?q?=E8=BF=99=E4=B8=AA=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E5=99=A8=EF=BC=8C=E5=8F=AF=E4=BB=A5=E5=8E=BB=E6=8E=89=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=8F=82=E6=95=B0=E9=87=8C=E7=9A=84"null"=E5=80=BC?= =?UTF-8?q?=E3=80=82=E3=80=90=E8=85=BE=E8=AE=AF=E6=96=87=E6=A1=A3=E3=80=91?= =?UTF-8?q?SpringMVC=E5=AD=A6=E4=B9=A0=20=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20https://docs.qq.com/doc/?= =?UTF-8?q?DeXNEanBlc09MWG9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index ea2d45a..fcdccf3 100644 --- a/README.md +++ b/README.md @@ -8,19 +8,20 @@ Eric-Dream ## 主要实现功能如下 - 功能 | 实现 | 用途 ------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------|-------------- -IDEA开发热加载实现 | JBR + HotswapAgent | https://github.com/HotswapProjects/HotswapAgent - [jackson序列化](SERIALIZE.md) | 自定义序列化器 | 解决参数枚举的序列化问题 - logback钉钉通知 | 自定义Appender | Error消息及时通知 - logback邮件通知 | 默认支持 | Error异常及时通知 - 全局异常捕获 | 默认支持 | 捕获异常 - 数据库字段加解密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 给部分数据库字段加解密 - 执行初始化SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | - [MybatisPlus的SQL脚本自动维护](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) | https://baomidou.com/pages/1812u1/ | 自动建表 - SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | -参数全局trim() | [StringTrimDeserializer](common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java) | 避免异常数据 -Long类型超长转String | | 解决前端无法正确显示超长String + 功能 | 实现 | 用途 +-----------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------|------------------------------------------------- + IDEA开发热加载实现 | JBR + HotswapAgent | https://github.com/HotswapProjects/HotswapAgent + [jackson序列化](SERIALIZE.md) | 自定义序列化器 | 解决参数枚举的序列化问题 + logback钉钉通知 | 自定义Appender | Error消息及时通知 + logback邮件通知 | 默认支持 | Error异常及时通知 + 全局异常捕获 | 默认支持 | 捕获异常 + 数据库字段加解密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 给部分数据库字段加解密 + 执行初始化SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | + [MybatisPlus的SQL脚本自动维护](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) | https://baomidou.com/pages/1812u1/ | 自动建表 + SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | + 参数全局trim() | [StringTrimDeserializer](common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java) | 避免异常数据 + Long类型超长转String | | 解决前端无法正确显示超长String + 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决"null"等问题 具体框架如下表: @@ -39,7 +40,9 @@ Ctrl + Shift + F9 重新编译和加载修改的类文件即可。 > http://blog.houxiaoyi.cn/#/src/Java/%E7%83%AD%E5%8A%A0%E8%BD%BD ### 执行初始化的sql语句 + 有两种方案。一种借助与mybatis-plus 另一种就是mybatis的 + #### 基于mybatis的sql执行方案 [hxy.dream.common.init.ApplicationStartupRunner](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) @@ -85,7 +88,6 @@ https\://services.gradle.org/distributions/gradle-7.4-bin.zip ![img_1.png](asset/img/gradle.png) - 技术 | 说明 | 官网 ----------------------|--------------------|-------------------------------------------------------------------------------------------------------------- Spring Boot | 容器+MVC框架 | [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot) @@ -130,7 +132,9 @@ https://spring.io/projects/spring-boot#support ```groovy api project(':dao') ``` + 以下是 gradle6前后的使用方式: + ```groovy // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上 // implementation project(':entity') /* 子模块之间的依赖 */ @@ -201,8 +205,8 @@ https://juejin.im/post/6844904196693557255 #### ORM层 -> 参考 [mybatis-plus官网](https://baomidou.com/pages/8390a4/#%E6%AD%A5%E9%AA%A41-%E5%A3%B0%E6%98%8E%E9%80%9A%E7%94%A8%E6%9E%9A%E4%B8%BE%E5%B1%9E%E6%80%A7) - +> +参考 [mybatis-plus官网](https://baomidou.com/pages/8390a4/#%E6%AD%A5%E9%AA%A41-%E5%A3%B0%E6%98%8E%E9%80%9A%E7%94%A8%E6%9E%9A%E4%B8%BE%E5%B1%9E%E6%80%A7) 1. [自动填充字段](https://docs.qq.com/doc/DSG5Zbk9RR1FHRVZE) @@ -220,7 +224,7 @@ https://blog.csdn.net/bandancer/article/details/84926383 [关于springboot中添加Filter的方法](https://www.jianshu.com/p/3d421fbce734) -### +### ``` WARN at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive (PoolBase.java:184) - HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@63ec6a5a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. @@ -241,7 +245,8 @@ https://blog.csdn.net/qq_27127145/article/details/85775240 # TODO -- [x] 有的前端输入带有空格或者换行,到数据库存储可能会发生意想不到的bug,所以需要在反序列化的时候,需要将其中的非法字符去掉。需要设计一个方案做下全局的参数trim() +- [x] + 有的前端输入带有空格或者换行,到数据库存储可能会发生意想不到的bug,所以需要在反序列化的时候,需要将其中的非法字符去掉。需要设计一个方案做下全局的参数trim() ### 构建 -- Gitee From 45daa339ff84ef1f56c107f6bdb7bce15b0da032 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 1 Jun 2023 09:07:59 +0800 Subject: [PATCH 062/204] =?UTF-8?q?=E5=8E=BB=E6=8E=89nil?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hxy/dream/common/converter/StringToStringConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java b/common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java index 7da3383..c561778 100644 --- a/common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java +++ b/common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java @@ -19,7 +19,7 @@ public class StringToStringConverter implements Converter { @Override public String convert(String source) { log.info("convert source: {}", source); - if (source != null && "null".equals(source.toLowerCase()) || !"nil".equals(source)) { + if (source != null && "null".equals(source.toLowerCase())) { return ""; } return source; -- Gitee From 6ab6923b1a6290be417e862bc00eadfdff410fe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 1 Jun 2023 15:09:09 +0800 Subject: [PATCH 063/204] 1 --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 64e198c..9e20e33 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ build/ **/build/ **/out/ /app/src/main/resources/application-dev.yml +class/ -- Gitee From 8e5d00f0f0e1c7b887bdb979b892b9b7ea41d5fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 2 Jun 2023 15:03:16 +0800 Subject: [PATCH 064/204] =?UTF-8?q?redis=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 - .../dream/common/reids/RedisTemplateTest.java | 37 +++++++++++++++++++ build.gradle | 4 ++ common/build.gradle | 1 - dao/build.gradle | 1 - 5 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 app/src/test/java/hxy/dream/common/reids/RedisTemplateTest.java diff --git a/app/build.gradle b/app/build.gradle index 8bda4a3..53d3692 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,6 +6,4 @@ bootJar.enabled = true dependencies { api project(':common') - - testImplementation group: 'junit', name: 'junit', version: '4.13.2' } diff --git a/app/src/test/java/hxy/dream/common/reids/RedisTemplateTest.java b/app/src/test/java/hxy/dream/common/reids/RedisTemplateTest.java new file mode 100644 index 0000000..70f6ad2 --- /dev/null +++ b/app/src/test/java/hxy/dream/common/reids/RedisTemplateTest.java @@ -0,0 +1,37 @@ +package hxy.dream.common.reids; + +import hxy.dream.BaseTest; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; + +/** + * @author eric + * @description + * @date 2023/6/2 + */ +public class RedisTemplateTest extends BaseTest { + + private static final Logger log = LoggerFactory.getLogger(RedisTemplateTest.class); + + + @Autowired + RedisTemplate redisTemplate; + + @Test + public void testRedisTemplate() { + ValueOperations valueOperations = redisTemplate.opsForValue(); + String key = "key"; + valueOperations.set(key, "value"); + + Object o = valueOperations.get(key); + + log.info("结果:{}", o); + + + } + +} diff --git a/build.gradle b/build.gradle index 416006e..f93fe6c 100644 --- a/build.gradle +++ b/build.gradle @@ -125,6 +125,8 @@ subprojects { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'org.springframework.data:spring-data-redis' + implementation 'com.zaxxer:HikariCP:5.0.1' implementation 'p6spy:p6spy:3.9.1' implementation 'org.springframework.boot:spring-boot-starter-webflux' @@ -135,6 +137,8 @@ subprojects { testAnnotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' testImplementation 'io.projectreactor:reactor-test' + + testImplementation group: 'junit', name: 'junit', version: '4.12' // https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-sentinel // compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-alibaba-sentinel', version: '0.9.0.RELEASE' diff --git a/common/build.gradle b/common/build.gradle index ae65d9e..0a0d5ca 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -30,5 +30,4 @@ dependencies { // https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter // compile 'org.redisson:redisson-spring-boot-starter:3.15.0' - testImplementation group: 'junit', name: 'junit', version: '4.12' } diff --git a/dao/build.gradle b/dao/build.gradle index 5e825dd..573f134 100644 --- a/dao/build.gradle +++ b/dao/build.gradle @@ -13,6 +13,5 @@ dependencies { // mysql的驱动版本应该是受啥控制了,可以忽略版本号,后期可以调查下,通过依赖分析目前没有找到原因 runtimeOnly 'mysql:mysql-connector-java:8.0.33' - testImplementation group: 'junit', name: 'junit', version: '4.13.2' } -- Gitee From d9460a34e335ac17625b1777c256092c045600e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 2 Jun 2023 19:46:56 +0800 Subject: [PATCH 065/204] unit test --- .../hxy/dream/app/service/impl/UserServiceImplTest.java | 9 +++++++++ build.gradle | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/hxy/dream/app/service/impl/UserServiceImplTest.java b/app/src/test/java/hxy/dream/app/service/impl/UserServiceImplTest.java index 7e5dca5..e7941b8 100644 --- a/app/src/test/java/hxy/dream/app/service/impl/UserServiceImplTest.java +++ b/app/src/test/java/hxy/dream/app/service/impl/UserServiceImplTest.java @@ -8,6 +8,8 @@ import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; +import java.util.List; + @Slf4j public class UserServiceImplTest extends BaseTest { @Autowired @@ -26,4 +28,11 @@ public class UserServiceImplTest extends BaseTest { UserModel userModel = userService.get("87"); log.info("\n====>{}",userModel); } + + @Test + public void listTest(){ + + List userModels = userService.list(); + log.info("\n====>{}",userModels); + } } diff --git a/build.gradle b/build.gradle index f93fe6c..0fdfe3d 100644 --- a/build.gradle +++ b/build.gradle @@ -79,7 +79,8 @@ allprojects { test { // 要用junit可以换成:useJUnitPlatform() TestNG更好更丰富 - useTestNG() +// useTestNG() + useJUnitPlatform() } } -- Gitee From 48a9077f0e588658cedf4fce11cd6a4b6a532515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 2 Jun 2023 20:11:16 +0800 Subject: [PATCH 066/204] =?UTF-8?q?unit=20test=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E7=9A=84jupiter=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 ++++ app/src/test/java/hxy/dream/BaseTest.java | 3 --- app/src/test/java/hxy/dream/app/service/impl/EnumTest.java | 6 +++--- .../hxy/dream/app/service/impl/UserServiceImplTest.java | 6 +++++- app/src/test/java/hxy/dream/common/email/EmailTest.java | 3 +-- .../test/java/hxy/dream/common/manager/RemoteApiTest.java | 2 +- .../java/hxy/dream/common/reids/RedisTemplateTest.java | 2 +- .../java/hxy/dream/common/study/EricFactoryBeanTest.java | 2 +- app/src/test/java/hxy/dream/util/IntegerTest.java | 7 +++---- app/src/test/java/hxy/dream/util/JacksonTest.java | 2 +- build.gradle | 3 +-- 11 files changed, 21 insertions(+), 19 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 53d3692..a47d5af 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,3 +7,7 @@ bootJar.enabled = true dependencies { api project(':common') } + +test { + useJUnitPlatform() +} \ No newline at end of file diff --git a/app/src/test/java/hxy/dream/BaseTest.java b/app/src/test/java/hxy/dream/BaseTest.java index 1c2954c..7c3b552 100644 --- a/app/src/test/java/hxy/dream/BaseTest.java +++ b/app/src/test/java/hxy/dream/BaseTest.java @@ -1,11 +1,8 @@ package hxy.dream; import hxy.dream.app.Application; -import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @SpringBootTest(classes = Application.class) -@RunWith(SpringJUnit4ClassRunner.class) public abstract class BaseTest { } diff --git a/app/src/test/java/hxy/dream/app/service/impl/EnumTest.java b/app/src/test/java/hxy/dream/app/service/impl/EnumTest.java index 51e7d1d..1c2300b 100644 --- a/app/src/test/java/hxy/dream/app/service/impl/EnumTest.java +++ b/app/src/test/java/hxy/dream/app/service/impl/EnumTest.java @@ -5,9 +5,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.deser.std.StringDeserializer; import hxy.dream.BaseTest; import hxy.dream.entity.enums.GenderEnum; -import org.junit.Test; import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; /** * @author eric @@ -31,7 +31,7 @@ public class EnumTest extends BaseTest { } - @org.junit.Test + @Test public void enumJsonTest(){ try { String s = objectMapper.writeValueAsString(GenderEnum.BOY); @@ -42,7 +42,7 @@ public class EnumTest extends BaseTest { e.printStackTrace(); } } - @org.junit.Test + @Test public void enumJsonTest2(){ GenderEnum byCode = GenderEnum.getEnumByCode(100); diff --git a/app/src/test/java/hxy/dream/app/service/impl/UserServiceImplTest.java b/app/src/test/java/hxy/dream/app/service/impl/UserServiceImplTest.java index e7941b8..aa4361d 100644 --- a/app/src/test/java/hxy/dream/app/service/impl/UserServiceImplTest.java +++ b/app/src/test/java/hxy/dream/app/service/impl/UserServiceImplTest.java @@ -5,16 +5,20 @@ import hxy.dream.app.entity.param.UserParam; import hxy.dream.app.service.UserService; import hxy.dream.dao.model.UserModel; import lombok.extern.slf4j.Slf4j; -import org.junit.Test; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import java.util.List; @Slf4j public class UserServiceImplTest extends BaseTest { + @Autowired UserService userService; + @Test + @Order(1) public void arunTest(){ UserParam userParam = new UserParam(); userParam.setName("111"); diff --git a/app/src/test/java/hxy/dream/common/email/EmailTest.java b/app/src/test/java/hxy/dream/common/email/EmailTest.java index b444a9f..134f683 100644 --- a/app/src/test/java/hxy/dream/common/email/EmailTest.java +++ b/app/src/test/java/hxy/dream/common/email/EmailTest.java @@ -9,8 +9,7 @@ import jakarta.mail.MessagingException; import jakarta.mail.NoSuchProviderException; import jakarta.mail.Session; import jakarta.mail.Store; -import jakarta.mail.search.SubjectTerm; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/app/src/test/java/hxy/dream/common/manager/RemoteApiTest.java b/app/src/test/java/hxy/dream/common/manager/RemoteApiTest.java index 3d7b4e4..92ced08 100644 --- a/app/src/test/java/hxy/dream/common/manager/RemoteApiTest.java +++ b/app/src/test/java/hxy/dream/common/manager/RemoteApiTest.java @@ -3,7 +3,7 @@ package hxy.dream.common.manager; import hxy.dream.BaseTest; import lombok.extern.slf4j.Slf4j; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @Slf4j diff --git a/app/src/test/java/hxy/dream/common/reids/RedisTemplateTest.java b/app/src/test/java/hxy/dream/common/reids/RedisTemplateTest.java index 70f6ad2..a5389e3 100644 --- a/app/src/test/java/hxy/dream/common/reids/RedisTemplateTest.java +++ b/app/src/test/java/hxy/dream/common/reids/RedisTemplateTest.java @@ -1,7 +1,7 @@ package hxy.dream.common.reids; import hxy.dream.BaseTest; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; diff --git a/app/src/test/java/hxy/dream/common/study/EricFactoryBeanTest.java b/app/src/test/java/hxy/dream/common/study/EricFactoryBeanTest.java index e981886..f49a5ed 100644 --- a/app/src/test/java/hxy/dream/common/study/EricFactoryBeanTest.java +++ b/app/src/test/java/hxy/dream/common/study/EricFactoryBeanTest.java @@ -2,7 +2,7 @@ package hxy.dream.common.study; import hxy.dream.BaseTest; import hxy.dream.app.Application; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; diff --git a/app/src/test/java/hxy/dream/util/IntegerTest.java b/app/src/test/java/hxy/dream/util/IntegerTest.java index 7a22b26..bf88218 100644 --- a/app/src/test/java/hxy/dream/util/IntegerTest.java +++ b/app/src/test/java/hxy/dream/util/IntegerTest.java @@ -1,8 +1,7 @@ package hxy.dream.util; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; /** * @author eric @@ -16,13 +15,13 @@ public class IntegerTest { public void tests(){ int i = 1290; Integer j =1290; - Assert.assertTrue(j==i); +// Assert.assertTrue(j==i); } @Test public void test2(){ Integer i = 1290; Integer j =1290; - Assert.assertTrue(j==i); +// Assert.assertTrue(j==i); } } diff --git a/app/src/test/java/hxy/dream/util/JacksonTest.java b/app/src/test/java/hxy/dream/util/JacksonTest.java index 207a585..a2c7446 100644 --- a/app/src/test/java/hxy/dream/util/JacksonTest.java +++ b/app/src/test/java/hxy/dream/util/JacksonTest.java @@ -5,7 +5,7 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import hxy.dream.common.serializer.SqlDateJsonSerializer; import hxy.dream.entity.dto.UserDTO; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/build.gradle b/build.gradle index 0fdfe3d..5c68688 100644 --- a/build.gradle +++ b/build.gradle @@ -139,7 +139,6 @@ subprojects { testCompileOnly 'org.projectlombok:lombok' testImplementation 'io.projectreactor:reactor-test' - testImplementation group: 'junit', name: 'junit', version: '4.12' // https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-sentinel // compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-alibaba-sentinel', version: '0.9.0.RELEASE' @@ -169,4 +168,4 @@ jib { mainClass = 'com.xxx.RunApplication' ports = ['8080'] } -} +} \ No newline at end of file -- Gitee From 916fcf03417ebfa8a21561c48ae40a463eaf74b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 5 Jun 2023 17:43:02 +0800 Subject: [PATCH 067/204] =?UTF-8?q?null=E5=86=99=E5=85=A5=E5=88=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hxy/dream/dao/mapper/UserMapperTest.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java diff --git a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java new file mode 100644 index 0000000..1d49714 --- /dev/null +++ b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java @@ -0,0 +1,36 @@ +package hxy.dream.dao.mapper; + +import hxy.dream.BaseTest; +import hxy.dream.dao.model.UserModel; +import jakarta.annotation.Resource; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * @author eric + * @description + * @date 2023/6/5 + */ +public class UserMapperTest extends BaseTest { + + private static final Logger log = LoggerFactory.getLogger(UserMapperTest.class); + + + @Resource + UserMapper userMapper; + + @Test + public void testUpdateNull() { + + UserModel userModel = new UserModel(); + userModel.setId(1); + userModel.setAge(23); + userModel.setName(null); +// https://blog.csdn.net/konnysnow/article/details/121421210 +// 当然也可以用 lambdaUpdateWrapper.set(userModel::getName, null); + int i = userMapper.updateById(userModel); + log.info("Updated {}", i); + } + +} -- Gitee From 0b78369888881a11d7000135625e9a1e785874e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 5 Jun 2023 19:02:33 +0800 Subject: [PATCH 068/204] 1 --- app/build.gradle | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index a47d5af..9767067 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,6 +6,9 @@ bootJar.enabled = true dependencies { api project(':common') + + implementation 'org.springframework.data:spring-data-redis' + } test { -- Gitee From 38e46c7fc5cfe946dbab287aa40b8206cdf712ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 5 Jun 2023 21:38:01 +0800 Subject: [PATCH 069/204] 1 --- .../hxy/dream/dao/mapper/UserMapperTest.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java index 1d49714..ab38cff 100644 --- a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java +++ b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java @@ -1,5 +1,6 @@ package hxy.dream.dao.mapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import hxy.dream.BaseTest; import hxy.dream.dao.model.UserModel; import jakarta.annotation.Resource; @@ -26,11 +27,27 @@ public class UserMapperTest extends BaseTest { UserModel userModel = new UserModel(); userModel.setId(1); userModel.setAge(23); - userModel.setName(null); + userModel.setName(null); // mybatis-plus是默认不更新 null的属性 // https://blog.csdn.net/konnysnow/article/details/121421210 // 当然也可以用 lambdaUpdateWrapper.set(userModel::getName, null); int i = userMapper.updateById(userModel); log.info("Updated {}", i); } + @Test + public void testUpdateSetNull() { + UserModel userModel = new UserModel(); + userModel.setId(1); + userModel.setAge(231); + + LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper(); + lambdaUpdateWrapper.set(UserModel::getName, null); // 强制修改数据库为null + lambdaUpdateWrapper.eq(UserModel::getId, userModel.getId()); + + int update = userMapper.update(userModel, lambdaUpdateWrapper); + log.info("Updated user{}", update); + + } + + } -- Gitee From 3c01ebcb3b1b68b83c6009045e42d9bf52552487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 6 Jun 2023 22:21:15 +0800 Subject: [PATCH 070/204] =?UTF-8?q?raw=20sql=20=E7=9A=84=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=3D>=20ORM=E6=A1=86=E6=9E=B6=E5=B0=B1?= =?UTF-8?q?=E6=98=AF=E5=B9=B2=E8=BF=99=E4=BA=8B=E5=BE=97=E3=80=82=201.=20?= =?UTF-8?q?=E7=94=9F=E6=88=90=20raw=20sql=202.=20=E6=8B=BC=E6=8E=A5?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/hxy/dream/jdbc/JdbcTest.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 app/src/test/java/hxy/dream/jdbc/JdbcTest.java diff --git a/app/src/test/java/hxy/dream/jdbc/JdbcTest.java b/app/src/test/java/hxy/dream/jdbc/JdbcTest.java new file mode 100644 index 0000000..099ab3a --- /dev/null +++ b/app/src/test/java/hxy/dream/jdbc/JdbcTest.java @@ -0,0 +1,87 @@ +package hxy.dream.jdbc; + +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +public class JdbcTest { + + private static final Logger log = LoggerFactory.getLogger(JdbcTest.class); + + + @Test + public void testJdbcInsert() throws ClassNotFoundException, SQLException { + // 1. 注册驱动 + // 使用java.sql.DriverManager类的静态方法registerDriver(Driver driver) + // Driver是一个接口,参数传递:MySQL驱动程序的实现类 + // DriverManager.registerDriver(new Driver()); + // 查看驱动类源码,注册两次驱动,浪费资源 + Class.forName("com.mysql.cj.jdbc.Driver"); + // 2. 获得连接 + // uri:数据库地址 jdbc:mysql://连接主机ip:端口号//数据库名字 + String url = "jdbc:mysql://mysql.cupb.top:3306/eric"; + // static Connection getConnection(String url, String user, String password) + // 返回值是java.sql.Connection接口的实现类,在MySQL驱动程序中 + Connection conn = DriverManager.getConnection(url, "eric", "dream,1234.."); + System.out.println(conn);// com.mysql.jdbc.JDBC4Connection@10d1f30 + // 3. 获得语句执行平台,通过数据库连接对象,获取到SQL语句的执行者对象 + //conn对象,调用方法 Statement createStatement() 获取Statement对象,将SQL语句发送到数据库 + //返回的是Statement接口的实现类对象,在MySQL驱动程序中 + Statement stat = conn.createStatement(); + System.out.println(stat);//com.mysql.jdbc.StatementImpl@137bc9 + // 4. 执行sql语句 + //通过执行者对象调用方法执行SQL语句,获取结果 + //int executeUpdate(String sql) 执行数据库中的SQL语句,仅限于insert,update,delete + //返回值int,操作成功数据库的行数 + int row = stat.executeUpdate("INSERT INTO user_model(name,age,address) VALUES('汽车用品',50,'疯狂涨价')"); + log.info("affect row {}", row); + // 5. 释放资源 + stat.close(); + conn.close(); +// 原文链接:https://blog.csdn.net/qq_35537301/article/details/81154182 + } + + + @Test + public void testJdbcSelect() throws ClassNotFoundException, SQLException { + Class.forName("com.mysql.cj.jdbc.Driver"); + // 2. 获得连接 + // uri:数据库地址 jdbc:mysql://连接主机ip:端口号//数据库名字 + String url = "jdbc:mysql://mysql.cupb.top:3306/eric"; + // static Connection getConnection(String url, String user, String password) + // 返回值是java.sql.Connection接口的实现类,在MySQL驱动程序中 + Connection conn = DriverManager.getConnection(url, "eric", "dream,1234.."); + + String id = "1"; + String name = "汽车用品"; + + // 拼写SQL语句 + String sql = "select * from user_model where id = ? or name = ? "; + // 3.获取执行SQL语句 + //Connection接口 + PreparedStatement pst = conn.prepareStatement(sql); + //调用pst对象的setXXX方法设置问号占位符的参数 + pst.setObject(1, id); + pst.setObject(2, name); + System.out.println(sql); + // 4.调用执行者对象方法,执行SQL语句获取结果集 + ResultSet rs = pst.executeQuery(); + // 5.处理结果集 + while (rs.next()) { + log.info(rs.getString("name") + "\t" + rs.getString("address")); + } + // 6.关闭资源 + rs.close(); + pst.close(); + conn.close(); +// 原文链接:https://blog.csdn.net/qq_35537301/article/details/81154182 + } + +} -- Gitee From 52a406e0cac46f18c1edb363ab44c88eda69cb2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 6 Jun 2023 22:30:33 +0800 Subject: [PATCH 071/204] =?UTF-8?q?raw=20sql=20=E7=9A=84=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=3D>=20ORM=E6=A1=86=E6=9E=B6=E5=B0=B1?= =?UTF-8?q?=E6=98=AF=E5=B9=B2=E8=BF=99=E4=BA=8B=E5=BE=97=E3=80=82=201.=20?= =?UTF-8?q?=E7=94=9F=E6=88=90=20raw=20sql=202.=20=E6=8B=BC=E6=8E=A5?= =?UTF-8?q?=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/test/java/hxy/dream/jdbc/JdbcTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/test/java/hxy/dream/jdbc/JdbcTest.java b/app/src/test/java/hxy/dream/jdbc/JdbcTest.java index 099ab3a..6b9e08c 100644 --- a/app/src/test/java/hxy/dream/jdbc/JdbcTest.java +++ b/app/src/test/java/hxy/dream/jdbc/JdbcTest.java @@ -25,7 +25,7 @@ public class JdbcTest { // 查看驱动类源码,注册两次驱动,浪费资源 Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 获得连接 - // uri:数据库地址 jdbc:mysql://连接主机ip:端口号//数据库名字 + // uri:数据库地址 jdbc:mysql://连接主机ip:端口号//数据库名字= String url = "jdbc:mysql://mysql.cupb.top:3306/eric"; // static Connection getConnection(String url, String user, String password) // 返回值是java.sql.Connection接口的实现类,在MySQL驱动程序中 @@ -67,7 +67,7 @@ public class JdbcTest { // 3.获取执行SQL语句 //Connection接口 PreparedStatement pst = conn.prepareStatement(sql); - //调用pst对象的setXXX方法设置问号占位符的参数 + //调用pst对象的setXXX方法设置问号占位符的参数 下面参数的设置具体是由 mysql驱动实现的。(面向接口编程,只管申明,具体执行由接口实现) pst.setObject(1, id); pst.setObject(2, name); System.out.println(sql); -- Gitee From dccd940d93851fdb4248f3fde7956b5ef880ec80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 6 Jun 2023 22:49:41 +0800 Subject: [PATCH 072/204] =?UTF-8?q?=E5=9F=BA=E4=BA=8Emybatis-plus=E7=9A=84?= =?UTF-8?q?sql=E6=89=A7=E8=A1=8C=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/README.md b/README.md index fcdccf3..b1e4a84 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,25 @@ Ctrl + Shift + F9 重新编译和加载修改的类文件即可。 #### 基于mybatis-plus的sql执行方案 +##### 基于mybatis-plus配置直接执行 + +https://www.baomidou.com/pages/226c21/#%E9%85%8D%E7%BD%AE + +```yaml +# DataSource Config +spring: + datasource: + driver-class-name: org.h2.Driver + username: root + password: test + sql: + init: + schema-locations: classpath:db/schema-h2.sql + data-locations: classpath:db/data-h2.sql +``` + +##### 基于mybatis-plus的sql执行方案 + [hxy.dream.common.init.MysqlDdl](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) ### OpenFeign要退出历史舞台了 -- Gitee From 745e16c8e06fa9719230dbb77ec76fd5b18e9bdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 7 Jun 2023 13:21:16 +0800 Subject: [PATCH 073/204] =?UTF-8?q?=E5=8A=A0=E4=B8=8AcontextName?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/resources/application-test.yml | 1 + app/src/main/resources/logback-spring.xml | 2 ++ entity/build.gradle | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/resources/application-test.yml b/app/src/main/resources/application-test.yml index 04087a2..a0bacb7 100755 --- a/app/src/main/resources/application-test.yml +++ b/app/src/main/resources/application-test.yml @@ -47,6 +47,7 @@ logging: hxy.dream.dao: trace # 显示mybatis的操作时候所有级别的日志 hxy.dream: debug com.fasterxml.jackson: debug + com.baomidou.mybatisplus: debug mybatis-plus: configuration: diff --git a/app/src/main/resources/logback-spring.xml b/app/src/main/resources/logback-spring.xml index e25411e..eb39751 100644 --- a/app/src/main/resources/logback-spring.xml +++ b/app/src/main/resources/logback-spring.xml @@ -8,6 +8,8 @@ + hxy + diff --git a/entity/build.gradle b/entity/build.gradle index 3d18a72..8db09cb 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,7 +8,7 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-boot-starter:3.5.3.1' + api 'com.baomidou:mybatis-plus-boot-starter:3.5.3.3-SNAPSHOT' api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.1' api 'org.springframework.boot:spring-boot-starter-validation' api 'jakarta.annotation:jakarta.annotation-api:2.1.1' -- Gitee From 01c16246cf7a04ac4f9e8ab1282083f3e9549f76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 8 Jun 2023 10:51:26 +0800 Subject: [PATCH 074/204] =?UTF-8?q?=E5=8A=A0=E4=B8=8Abanner?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/resources/banner.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 app/src/main/resources/banner.txt diff --git a/app/src/main/resources/banner.txt b/app/src/main/resources/banner.txt new file mode 100644 index 0000000..9dfad75 --- /dev/null +++ b/app/src/main/resources/banner.txt @@ -0,0 +1,10 @@ + + _____ ______ _______ ________ _____ + / ____| ____| __ \ \ / / ____| __ \ +| (___ | |__ | |__) \ \ / /| |__ | |__) | + \___ \| __| | _ / \ \/ / | __| | _ / + ____) | |____| | \ \ \ / | |____| | \ \ +|_____/|______|_| \_\ \/ |______|_| \_\ + +🚀 SpringBoot:${spring-boot.formatted-version} 😂 当前激活环境变量 ${spring.profiles.active} 端口 ${server.port} + -- Gitee From 02255660d80de2174f8abbe4c223cad3d1224a32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 8 Jun 2023 10:59:34 +0800 Subject: [PATCH 075/204] =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E6=AD=A3=E5=B8=B8?= =?UTF-8?q?=E6=89=93=E5=8D=B0=E7=9A=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index 1e2ab91..3a43ec2 100755 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -12,7 +12,7 @@ spring: multipart: enabled: false profiles: - active: beta #环境隔离 + active: test #环境隔离 mail: username: aohanhongzhi@qq.com password: vtrxapjtpcivdbcb -- Gitee From 838cffe550a72f1deb8bf5d695cbe0dd699d1e82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 9 Jun 2023 00:17:15 +0800 Subject: [PATCH 076/204] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=BB=BA=E8=A1=A8?= =?UTF-8?q?=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/init/ApplicationStartupRunner.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java b/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java index 6f46db7..3373bf0 100644 --- a/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java +++ b/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java @@ -3,10 +3,12 @@ package hxy.dream.common.init; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.io.Resources; import org.apache.ibatis.jdbc.ScriptRunner; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; +import javax.sql.DataSource; import java.nio.charset.Charset; import java.sql.Connection; import java.sql.DriverManager; @@ -15,7 +17,7 @@ import java.sql.DriverManager; * @link https://blog.csdn.net/m0_37456570/article/details/83751401 */ @Slf4j -//@Component +@Component public class ApplicationStartupRunner implements CommandLineRunner { @Value("${spring.datasource.driver-class-name}") @@ -27,16 +29,25 @@ public class ApplicationStartupRunner implements CommandLineRunner { @Value("${spring.datasource.password}") private String password; + @Autowired + DataSource dataSource; + @Override public void run(String... args) throws Exception { log.info("ApplicationStartupRunner run method Started !!"); - // 执行sql脚本语句 + Connection connection = null; + boolean jdbc = false; try { - Class.forName(driver); - connection = DriverManager.getConnection(url, userName, password); - // 设置不自动提交 - connection.setAutoCommit(false); + if (jdbc) { + Class.forName(driver); + connection = DriverManager.getConnection(url, userName, password); + // 设置不自动提交 + connection.setAutoCommit(false); + } else { + connection = dataSource.getConnection(); + } + ScriptRunner runner = new ScriptRunner(connection); // 设置不自动提交 runner.setAutoCommit(false); @@ -55,15 +66,17 @@ public class ApplicationStartupRunner implements CommandLineRunner { runner.setLogWriter(null); // 如果又多个sql文件,可以写多个runner.runScript(xxx), Resources.setCharset(Charset.forName("UTF8")); - + // 执行sql脚本语句 ScriptRunner scriptRunner = new ScriptRunner(connection); scriptRunner.runScript(Resources.getResourceAsReader("table.sql")); connection.commit(); } catch (Exception e) { - log.error("{}", e); + log.error("执行sql脚本失败 {}", e); } finally { - if (connection != null) { - connection.close();// 连接关闭 + if (jdbc) { + if (connection != null) { + connection.close();// 连接关闭 + } } } } -- Gitee From 93ff5dd0fe56afb4501ab4ef6c815c5e0536afb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 9 Jun 2023 11:05:15 +0800 Subject: [PATCH 077/204] HikariDataSource --- .../hxy/dream/common/init/ApplicationStartupRunner.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java b/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java index 3373bf0..d483ce8 100644 --- a/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java +++ b/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java @@ -29,6 +29,10 @@ public class ApplicationStartupRunner implements CommandLineRunner { @Value("${spring.datasource.password}") private String password; + /** + * javax.sql.DataSource 是一个接口,所以不用关心这个具体是谁实现的。 + * 可以是 mysql,p6spy,hikari,mybatis等 + */ @Autowired DataSource dataSource; @@ -71,7 +75,7 @@ public class ApplicationStartupRunner implements CommandLineRunner { scriptRunner.runScript(Resources.getResourceAsReader("table.sql")); connection.commit(); } catch (Exception e) { - log.error("执行sql脚本失败 {}", e); + log.error("执行sql脚本失败", e); } finally { if (jdbc) { if (connection != null) { -- Gitee From f2f0812ba9b183ae6345905144f1afbc9e6e42a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 9 Jun 2023 15:46:57 +0800 Subject: [PATCH 078/204] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/configuration/mybatis/CustomTypeHandler.java | 9 ++------- dao/src/main/java/hxy/dream/dao/util/KeyCenterUtils.java | 1 + 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java b/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java index 05f6e10..f9ab893 100644 --- a/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java +++ b/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java @@ -1,11 +1,5 @@ package hxy.dream.dao.configuration.mybatis; -/** - * @ClassName AESTypeHandler - * @date 2020/4/9 14:27. - * @Description - */ - import com.baomidou.mybatisplus.core.toolkit.StringUtils; import hxy.dream.dao.util.KeyCenterUtils; @@ -19,7 +13,8 @@ import java.sql.ResultSet; import java.sql.SQLException; /** - * 数据库字段加解密处理 + * 数据库字段加解密处理。 + * 加密后就有一个问题,没办法对数据进行检索了。比如like查询。但是mybatis-plus提供了自己企业版的加密方式可以做到。https://baomidou.com/pages/1864e1/#%E5%AD%97%E6%AE%B5%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86 * * @param */ diff --git a/dao/src/main/java/hxy/dream/dao/util/KeyCenterUtils.java b/dao/src/main/java/hxy/dream/dao/util/KeyCenterUtils.java index 17fe126..b2c3906 100644 --- a/dao/src/main/java/hxy/dream/dao/util/KeyCenterUtils.java +++ b/dao/src/main/java/hxy/dream/dao/util/KeyCenterUtils.java @@ -9,6 +9,7 @@ public class KeyCenterUtils { */ public static String encrypt(String src) { try { + // 最好替换成 RSA 或者 AES 。 Base64只能算是编码,不算加密。 String result = Base64.getEncoder().encodeToString(src.getBytes("UTF-8")); return result; } catch (Exception e) { -- Gitee From 1bcec8c15354ed347a27b704d38bfbd2841a5275 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 10 Jun 2023 15:03:07 +0800 Subject: [PATCH 079/204] =?UTF-8?q?=E5=B0=81=E8=A3=85=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E4=B8=8E=E5=9F=BA=E7=A1=80=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index b1e4a84..4560e01 100644 --- a/README.md +++ b/README.md @@ -262,6 +262,13 @@ https://blog.csdn.net/qq_27127145/article/details/85775240 > https://blog.csdn.net/u012954706/article/details/105437768 +# 封装类型与基础类型 + +1. 所有POJO类属性必须使用包装数据类型 +2. 所有的局部变量使用基本数据类型。 + +> 来自 《阿里巴巴Java开发规范》 + # TODO - [x] -- Gitee From a8971883e07d7fb2b51d9a2f357d00afef9a3a51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 12 Jun 2023 09:47:15 +0800 Subject: [PATCH 080/204] =?UTF-8?q?JavaBean=E6=8C=89=E7=85=A7=20Java=20?= =?UTF-8?q?=E8=A7=84=E8=8C=83=EF=BC=8C=E9=9C=80=E8=A6=81=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=20private?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/hxy/dream/dao/model/UserModel.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/dao/src/main/java/hxy/dream/dao/model/UserModel.java b/dao/src/main/java/hxy/dream/dao/model/UserModel.java index 64d704f..88da8f8 100644 --- a/dao/src/main/java/hxy/dream/dao/model/UserModel.java +++ b/dao/src/main/java/hxy/dream/dao/model/UserModel.java @@ -26,15 +26,15 @@ public class UserModel extends BaseModel { * 参考yaml文件配置id-type: auto */ @TableId(type = IdType.AUTO) - Integer id; - String name; - Integer age; - GenderEnum gender; - String password; + private Integer id; + private String name; + private Integer age; + private GenderEnum gender; + private String password; //有了这个数据库BaseMapper插入的时候才能加密 @TableField(typeHandler = CustomTypeHandler.class) - String address; + private String address; /** * 注意!! 必须开启映射注解 @@ -46,7 +46,7 @@ public class UserModel extends BaseModel { * 注意!!选择对应的 JSON 处理器也必须存在对应依赖包 */ @TableField(typeHandler = BasicInfoDTOTypeHandler.class) - List basicInfos; + private List basicInfos; @TableField(typeHandler = FastjsonTypeHandler.class) private OtherInfo otherInfo; -- Gitee From 8a67ac2769eb22c3fa434b3a2bbb7d638f6089b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 15 Jun 2023 14:30:37 +0800 Subject: [PATCH 081/204] MDC --- app/build.gradle | 2 ++ .../java/hxy/dream/entity/vo/BaseResponseVO.java | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index 9767067..edf5c77 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,6 +8,8 @@ dependencies { api project(':common') implementation 'org.springframework.data:spring-data-redis' +// implementation 'org.springframework.cloud:spring-cloud-starter-sleuth:3.1.7' + implementation 'com.yomahub:tlog-all-spring-boot-starter:1.5.0' } diff --git a/entity/src/main/java/hxy/dream/entity/vo/BaseResponseVO.java b/entity/src/main/java/hxy/dream/entity/vo/BaseResponseVO.java index bc7c6f6..082221b 100644 --- a/entity/src/main/java/hxy/dream/entity/vo/BaseResponseVO.java +++ b/entity/src/main/java/hxy/dream/entity/vo/BaseResponseVO.java @@ -1,6 +1,7 @@ package hxy.dream.entity.vo; import lombok.Data; +import org.slf4j.MDC; import java.io.Serializable; @@ -10,6 +11,7 @@ public class BaseResponseVO implements Serializable { String message; T data; Integer code; + String xid; public BaseResponseVO(Integer code, String message, T data) { this.code = code; @@ -40,4 +42,15 @@ public class BaseResponseVO implements Serializable { public static BaseResponseVO badrequest(String message, T data) { return new BaseResponseVO(500, message, data); } + + + /** + * 这个计划是由 spring-cloud-starter-sleuth 实现的。但是貌似spring-cloud-starter-sleuth没咋更新了,样例都是n年前的,还指向了zipkin。 + *

+ * 所以计划可以尝试用tlog实现下。https://tlog.yomahub.com/ https://github.com/dromara/TLog + */ + public String getXid() { + String traceId = MDC.get("traceId"); + return traceId; + } } -- Gitee From b600037570974dd333ce92cf069691b30d1e4bfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 28 Jun 2023 21:07:30 +0800 Subject: [PATCH 082/204] bump springboot from 3.1.0 to 3.1.1 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5c68688..3f305ce 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.1.0' + springBootVersion = '3.1.1' } repositories { mavenLocal() -- Gitee From a2516bcdf1980f0d752ff8cc42b75f14b14f739f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 7 Jul 2023 20:05:42 +0800 Subject: [PATCH 083/204] https://gitee.com/eric-tutorial/SpringCloud-multiple-gradle/issues/I7JJWP --- SERIALIZE.md | 6 +++++- app/src/main/resources/application.yml | 2 +- .../hxy/dream/common/configuration/BeanConfig.java | 12 ++++++++++-- .../hxy/dream/common/extend/ParameterRecord.java | 3 ++- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/SERIALIZE.md b/SERIALIZE.md index 8e7cc72..2262052 100644 --- a/SERIALIZE.md +++ b/SERIALIZE.md @@ -800,4 +800,8 @@ https://blog.csdn.net/zhuzhoulin/article/details/106758473 ### 序列化作用顺序 -全局配置的大于单个注解,测试 [hxy.dream.util.JacksonTest.testSqlDate](app/src/test/java/hxy/dream/util/JacksonTest.java) \ No newline at end of file +全局配置的大于单个注解,测试 [hxy.dream.util.JacksonTest.testSqlDate](app/src/test/java/hxy/dream/util/JacksonTest.java) + +### Java 8 date/time type `java.time.LocalDateTime` not supported by default + +Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: hxy.dream.entity.vo.BaseResponseVO["data"]->java.util.ArrayList[0]->hxy.dream.dao.model.UserModel["createTime"]) \ No newline at end of file diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index 3a43ec2..048ed27 100755 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -43,7 +43,7 @@ mybatis-plus: logic-delete-value: 1 # 逻辑已删除值(默认为 1) logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) id-type: auto - type-enums-package: hxy.dream.entity.enums +# column-format: "`%s`" # 解决数据库关键字问题 server: port: 8080 diff --git a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java index 71eb184..bb9e24b 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java @@ -11,11 +11,17 @@ import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; import hxy.dream.common.serializer.BaseEnumDeserializer; import hxy.dream.common.serializer.BaseEnumSerializer; import hxy.dream.common.serializer.BaseLongSerializer; @@ -64,11 +70,13 @@ public class BeanConfig { builder.timeZone(TimeZone.getDefault()); ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.registerModule(simpleModule); -/* + // FIXME 解决查询缓存转换异常的问题,这个月应该加在redis自己里面,加在全局,就会操作返回值里面带上类信息。 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + + // 解决: Java 8 date/time type `java.time.LocalDateTime` not supported by default // 支持 jdk 1.8 日期 ---- start --- objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.registerModule(new Jdk8Module()) @@ -76,7 +84,7 @@ public class BeanConfig { .registerModule(new ParameterNamesModule()); // --end -- - */ + // 配置忽略未知属性 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); diff --git a/common/src/main/java/hxy/dream/common/extend/ParameterRecord.java b/common/src/main/java/hxy/dream/common/extend/ParameterRecord.java index 8e0e1ca..a4f021a 100644 --- a/common/src/main/java/hxy/dream/common/extend/ParameterRecord.java +++ b/common/src/main/java/hxy/dream/common/extend/ParameterRecord.java @@ -3,6 +3,7 @@ package hxy.dream.common.extend; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.fasterxml.jackson.databind.ObjectMapper; import hxy.dream.common.util.IPAddress; +import hxy.dream.common.util.SpringUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Around; @@ -50,7 +51,7 @@ public class ParameterRecord { String[] ignoreUrl = new String[]{"actuator"}; - ObjectMapper objectMapper = new ObjectMapper(); + ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class); @Around("execution(* hxy.dream.*.controller.*.*(..))") public Object processTx(ProceedingJoinPoint jp) throws Throwable { -- Gitee From 852da1ad5cfaba612edee029461a2f9dd0f79587 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 10 Jul 2023 17:12:25 +0800 Subject: [PATCH 084/204] =?UTF-8?q?=E5=85=BC=E5=AE=B9elmentUi=E7=9A=84?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E6=97=B6=E9=97=B4=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dream/common/serializer/DateJsonDeserializer.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/serializer/DateJsonDeserializer.java b/common/src/main/java/hxy/dream/common/serializer/DateJsonDeserializer.java index 9eb170a..34eee46 100644 --- a/common/src/main/java/hxy/dream/common/serializer/DateJsonDeserializer.java +++ b/common/src/main/java/hxy/dream/common/serializer/DateJsonDeserializer.java @@ -10,13 +10,20 @@ import java.util.Date; public class DateJsonDeserializer extends JsonDeserializer { public static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + public static final SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); @Override public Date deserialize(com.fasterxml.jackson.core.JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, com.fasterxml.jackson.core.JsonProcessingException { try { - if (jsonParser != null && StringUtils.hasText(jsonParser.getText())) { - return format.parse(jsonParser.getText()); + String text = jsonParser.getText(); + if (jsonParser != null && StringUtils.hasText(text)) { + if (text.contains("T")) { + // element ui + return format2.parse(text); + } else { + return format.parse(text); + } } else { return null; } -- Gitee From ae82dcb6e0b808bd28732cef93f8917af81c2604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 11 Jul 2023 13:44:04 +0800 Subject: [PATCH 085/204] fix: https://gitee.com/eric-tutorial/SpringCloud-multiple-gradle/issues/I7JJWP --- app/src/test/resources/api/local.http | 2 +- build.gradle | 4 ++++ common/build.gradle | 5 ++-- .../configuration/BaseWebMvcConfig.java | 19 +++++++++++---- .../common/configuration/BeanConfig.java | 23 +++++++++++-------- 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/app/src/test/resources/api/local.http b/app/src/test/resources/api/local.http index 6d4be62..abd5a2f 100644 --- a/app/src/test/resources/api/local.http +++ b/app/src/test/resources/api/local.http @@ -1,4 +1,4 @@ -GET http://localhost:8080/user/get/9 +GET http://localhost:8080/user/get/1 ### 添加 POST http://localhost:8080/user/add/body diff --git a/build.gradle b/build.gradle index 3f305ce..67d614c 100644 --- a/build.gradle +++ b/build.gradle @@ -133,6 +133,10 @@ subprojects { implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation 'commons-io:commons-io:2.11.0' + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2' + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.15.2' // Java 8 Datatypes + implementation 'com.fasterxml.jackson:jackson-bom:2.15.2' // Java 8 Datatypes + compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' diff --git a/common/build.gradle b/common/build.gradle index 0a0d5ca..7fa4f2f 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -20,8 +20,9 @@ dependencies { implementation 'org.springframework.data:spring-data-redis' implementation 'redis.clients:jedis' - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.0' - + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2' + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.15.2' // Java 8 Datatypes + implementation 'com.fasterxml.jackson:jackson-bom:2.15.2' // Java 8 Datatypes implementation group: 'org.javassist', name: 'javassist', version: '3.27.0-GA' implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.19' implementation 'org.redisson:redisson:3.15.0' diff --git a/common/src/main/java/hxy/dream/common/configuration/BaseWebMvcConfig.java b/common/src/main/java/hxy/dream/common/configuration/BaseWebMvcConfig.java index 307d381..c47cfd9 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BaseWebMvcConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BaseWebMvcConfig.java @@ -1,8 +1,11 @@ package hxy.dream.common.configuration; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; @@ -11,6 +14,10 @@ import java.util.List; @Configuration public class BaseWebMvcConfig extends WebMvcConfigurationSupport { + + @Autowired + ObjectMapper objectMapper; + @Override protected void extendMessageConverters(List> converters) { for (HttpMessageConverter converter : converters) { @@ -19,10 +26,14 @@ public class BaseWebMvcConfig extends WebMvcConfigurationSupport { // ContentType: text/html,Chaset=UTF-8 ((StringHttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8); } - // 解决controller返回json对象中文乱码问题 -// if (converter instanceof MappingJackson2HttpMessageConverter) { -// ((MappingJackson2HttpMessageConverter) converter).setDefaultCharset(StandardCharsets.UTF_8); -// } + + if (converter instanceof MappingJackson2HttpMessageConverter) { + MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = (MappingJackson2HttpMessageConverter) converter; + // 把自己定义的序列化措施,放进去。 + mappingJackson2HttpMessageConverter.setObjectMapper(objectMapper); + // 解决controller返回json对象中文乱码问题 + mappingJackson2HttpMessageConverter.setDefaultCharset(StandardCharsets.UTF_8); + } } } diff --git a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java index bb9e24b..1de6e33 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; @@ -35,6 +36,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; +import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; @@ -57,6 +59,7 @@ public class BeanConfig { simpleModule.addSerializer(BaseEnum.class, new BaseEnumSerializer()); simpleModule.addSerializer(Date.class, new DateJsonSerializer()); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter)); simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter)); @@ -71,22 +74,24 @@ public class BeanConfig { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); objectMapper.registerModule(simpleModule); - // FIXME 解决查询缓存转换异常的问题,这个月应该加在redis自己里面,加在全局,就会操作返回值里面带上类信息。 - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + // 设置日期格式化格式 +// objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); + // 解决: Java 8 date/time type `java.time.LocalDateTime` not supported by default // 支持 jdk 1.8 日期 ---- start --- - objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - objectMapper.registerModule(new Jdk8Module()) - .registerModule(new JavaTimeModule()) - .registerModule(new ParameterNamesModule()); + +// objectMapper.registerModule(new Jdk8Module()) +// .registerModule(new JavaTimeModule()) +// .registerModule(new ParameterNamesModule()); +// objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); +// objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // --end -- +// objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); // 配置忽略未知属性 - objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); +// objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); return objectMapper; } -- Gitee From 845a033713162de767e20d60414a83054ae99b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 13 Jul 2023 17:26:30 +0800 Subject: [PATCH 086/204] fix : https://gitee.com/eric-tutorial/SpringCloud-multiple-gradle/issues/I7KZ1I --- app/src/main/resources/application.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index 048ed27..baa96f9 100755 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -47,6 +47,7 @@ mybatis-plus: server: port: 8080 + max-http-header-size: 102400 # 解决 https://gitee.com/eric-tutorial/SpringCloud-multiple-gradle/issues/I7KZ1I # tomcat: # threads: # max: 2 -- Gitee From 94645ca77aff8594dbc3fe0e3934dd371e4dae90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 14 Jul 2023 10:39:49 +0800 Subject: [PATCH 087/204] bump up --- app/build.gradle | 2 +- build.gradle | 4 ++-- dao/build.gradle | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index edf5c77..fec4e26 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ dependencies { api project(':common') implementation 'org.springframework.data:spring-data-redis' -// implementation 'org.springframework.cloud:spring-cloud-starter-sleuth:3.1.7' +// implementation 'org.springframework.cloud:spring-cloud-starter-sleuth:3.1.7' // 已经不支持了 implementation 'com.yomahub:tlog-all-spring-boot-starter:1.5.0' } diff --git a/build.gradle b/build.gradle index 67d614c..454113b 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.1.1' + springBootVersion = '3.1.1' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() @@ -33,7 +33,7 @@ buildscript { plugins { - id 'io.spring.dependency-management' version '1.1.0' + id 'io.spring.dependency-management' version '1.1.1' // https://github.com/spring-gradle-plugins/dependency-management-plugin id 'java-library' id 'idea' id "com.google.cloud.tools.jib" version "2.0.0" diff --git a/dao/build.gradle b/dao/build.gradle index 573f134..004f1d7 100644 --- a/dao/build.gradle +++ b/dao/build.gradle @@ -12,6 +12,6 @@ dependencies { api project(':entity') /* 子模块之间的依赖 */ // mysql的驱动版本应该是受啥控制了,可以忽略版本号,后期可以调查下,通过依赖分析目前没有找到原因 - runtimeOnly 'mysql:mysql-connector-java:8.0.33' + runtimeOnly 'com.mysql:mysql-connector-java:8.0.33' } -- Gitee From 212626bc8396614ce0b64d05269d61e6c3d274f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 14 Jul 2023 10:49:25 +0800 Subject: [PATCH 088/204] mysqkl --- dao/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dao/build.gradle b/dao/build.gradle index 004f1d7..573f134 100644 --- a/dao/build.gradle +++ b/dao/build.gradle @@ -12,6 +12,6 @@ dependencies { api project(':entity') /* 子模块之间的依赖 */ // mysql的驱动版本应该是受啥控制了,可以忽略版本号,后期可以调查下,通过依赖分析目前没有找到原因 - runtimeOnly 'com.mysql:mysql-connector-java:8.0.33' + runtimeOnly 'mysql:mysql-connector-java:8.0.33' } -- Gitee From 678db48a6b492d10db4274398a5e536e58b9e297 Mon Sep 17 00:00:00 2001 From: aohanhongzhi Date: Fri, 14 Jul 2023 12:51:26 +0800 Subject: [PATCH 089/204] =?UTF-8?q?jdk=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 4560e01..f14fe4d 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,10 @@ Eric-Dream 具体框架如下表: +## jdk下载 + +https://www.azul.com/ + ### 热加载技术 https://github.com/HotswapProjects/HotswapAgent -- Gitee From 4ab8954e7f0ef2994c192205170a1ec80ba39b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 17 Jul 2023 19:41:54 +0800 Subject: [PATCH 090/204] bump io.spring.dependency-management from 1.1.1 to 1.1.2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 454113b..bfb6f0d 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,7 @@ buildscript { plugins { - id 'io.spring.dependency-management' version '1.1.1' // https://github.com/spring-gradle-plugins/dependency-management-plugin + id 'io.spring.dependency-management' version '1.1.2' // https://github.com/spring-gradle-plugins/dependency-management-plugin id 'java-library' id 'idea' id "com.google.cloud.tools.jib" version "2.0.0" -- Gitee From 924e19ee641d9b30c6917d2850b00a9912286c59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 17 Jul 2023 23:06:28 +0800 Subject: [PATCH 091/204] =?UTF-8?q?=E9=9D=9EAOP=E7=9A=84=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E8=AE=B0=E5=BD=95=20https://www.bilibili.com?= =?UTF-8?q?/video/BV1ZW4y1Q7yG/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++ .../common/extend/InteractiveRecord.java | 50 +++++++++++++++++++ .../common/serializer/BaseEnumSerializer.java | 4 +- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 common/src/main/java/hxy/dream/common/extend/InteractiveRecord.java diff --git a/README.md b/README.md index f14fe4d..291bb91 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,10 @@ https://spring.io/projects/spring-boot#support ./gradlew clean bootJar -x test ``` +```shell +./gradlew bootRun -x test +``` + ```shell ./gradlew dependencyInsight --dependency mybatis ``` diff --git a/common/src/main/java/hxy/dream/common/extend/InteractiveRecord.java b/common/src/main/java/hxy/dream/common/extend/InteractiveRecord.java new file mode 100644 index 0000000..355dc59 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/extend/InteractiveRecord.java @@ -0,0 +1,50 @@ +package hxy.dream.common.extend; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.MethodParameter; +import org.springframework.http.HttpInputMessage; +import org.springframework.http.MediaType; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdviceAdapter; +import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; +import reactor.netty.http.server.HttpServerRequest; + +import java.lang.reflect.Type; + +/** + * 非AOP方式记录参数,严重依赖Servlet + * + * 有待再次调试 https://www.bilibili.com/video/BV1ZW4y1Q7yG/ + * + */ +//@Component +public class InteractiveRecord extends RequestBodyAdviceAdapter implements ResponseBodyAdvice { + private static final Logger log = LoggerFactory.getLogger(InteractiveRecord.class); + + @Override + public boolean supports(MethodParameter methodParameter, Type targetType, Class> converterType) { + return true; + } + + @Override + public boolean supports(MethodParameter returnType, Class> converterType) { + return true; + } + + @Override + public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { + log.info("请求参数{},{}", body,request.getURI()); + return body; + } + + @Override + public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class> converterType) { + log.info("返回参数{}", body); + return super.afterBodyRead(body, inputMessage, parameter, targetType, converterType); + } +} diff --git a/common/src/main/java/hxy/dream/common/serializer/BaseEnumSerializer.java b/common/src/main/java/hxy/dream/common/serializer/BaseEnumSerializer.java index add715d..050e3ce 100644 --- a/common/src/main/java/hxy/dream/common/serializer/BaseEnumSerializer.java +++ b/common/src/main/java/hxy/dream/common/serializer/BaseEnumSerializer.java @@ -14,8 +14,8 @@ public class BaseEnumSerializer extends JsonSerializer { @Override public void serialize(BaseEnum value, JsonGenerator gen, SerializerProvider serializerProvider) throws IOException { - if (log.isDebugEnabled()) { - log.debug("\n====>开始序列化[{}]", value); + if (log.isTraceEnabled()) { + log.trace("\n====>开始序列化[{}]", value); } if (value != null) { gen.writeStartObject(); -- Gitee From 2352a3c9897171be8fb6f4c48fef1b4a687797f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 17 Jul 2023 23:07:08 +0800 Subject: [PATCH 092/204] =?UTF-8?q?=E9=9D=9EAOP=E7=9A=84=E8=AF=B7=E6=B1=82?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E8=AE=B0=E5=BD=95=20https://www.bilibili.com?= =?UTF-8?q?/video/BV1ZW4y1Q7yG/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9e20e33..88ef259 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ build/ **/out/ /app/src/main/resources/application-dev.yml class/ +bin/ \ No newline at end of file -- Gitee From 8b3a35e7a85a04c584276c32b78568b226d0b632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 15 Aug 2023 16:05:16 +0800 Subject: [PATCH 093/204] bump springboot from 3.1.1 to 3.1.2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index bfb6f0d..0c5ef30 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.1.1' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.1.2' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() -- Gitee From 67309a4bf343fe685db50c4016aca0df71f59ed5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 15 Aug 2023 16:11:53 +0800 Subject: [PATCH 094/204] bump mybatis-plus from 3.5.3.3-SNAPSHOT to 3.5.3.2 --- entity/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entity/build.gradle b/entity/build.gradle index 8db09cb..c5eda4f 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,7 +8,7 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-boot-starter:3.5.3.3-SNAPSHOT' + api 'com.baomidou:mybatis-plus-boot-starter:3.5.3.2' api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.1' api 'org.springframework.boot:spring-boot-starter-validation' api 'jakarta.annotation:jakarta.annotation-api:2.1.1' -- Gitee From 491759197e1c915c1b4b273edbf959cef3e5b21d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 15 Aug 2023 16:18:07 +0800 Subject: [PATCH 095/204] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/hxy/dream/app/controller/UserController.java | 6 ++++++ .../main/java/hxy/dream/app/service/UserService.java | 2 ++ .../hxy/dream/app/service/impl/UserServiceImpl.java | 10 ++++++++++ app/src/test/resources/api/local.http | 4 +++- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/hxy/dream/app/controller/UserController.java b/app/src/main/java/hxy/dream/app/controller/UserController.java index 90fb6b0..08f6a54 100644 --- a/app/src/main/java/hxy/dream/app/controller/UserController.java +++ b/app/src/main/java/hxy/dream/app/controller/UserController.java @@ -11,6 +11,7 @@ import hxy.dream.entity.vo.BaseResponseVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -98,4 +99,9 @@ public class UserController { return BaseResponseVO.success(userParam); } + @DeleteMapping("delete") + public BaseResponseVO delete(Integer id) { + return userService.delete(id); + } + } diff --git a/app/src/main/java/hxy/dream/app/service/UserService.java b/app/src/main/java/hxy/dream/app/service/UserService.java index 6b1b62b..1e791f7 100644 --- a/app/src/main/java/hxy/dream/app/service/UserService.java +++ b/app/src/main/java/hxy/dream/app/service/UserService.java @@ -16,4 +16,6 @@ public interface UserService { BaseResponseVO exist(String id); List list(); + + BaseResponseVO delete(Integer id); } diff --git a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java index ae32347..72dc8c1 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java @@ -55,6 +55,16 @@ public class UserServiceImpl implements UserService { return userMapper.selectList(null); } + @Override + public BaseResponseVO delete(Integer id) { + int i = userMapper.deleteById(id); + if (i > 0) { + return BaseResponseVO.success(); + } else { + return BaseResponseVO.error("删除失败"); + } + } + /** * 判断用户id存在否 * diff --git a/app/src/test/resources/api/local.http b/app/src/test/resources/api/local.http index abd5a2f..a854254 100644 --- a/app/src/test/resources/api/local.http +++ b/app/src/test/resources/api/local.http @@ -26,7 +26,9 @@ Accept: application/json "age": 23 } -### +### 删除 +DELETE http://localhost:8080/user/delete?id=2 + ### 添加 POST http://localhost:8080/user/add2?gender=0&name=张三&age=22 Content-Type: application/x-www-form-urlencoded -- Gitee From de09ca2cbcedd4809c1673217f1bc5802b0a11c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 15 Aug 2023 16:35:15 +0800 Subject: [PATCH 096/204] bump io.spring.dependency-management from 1.1.2 to 1.1.3 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0c5ef30..c04e59f 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,7 @@ buildscript { plugins { - id 'io.spring.dependency-management' version '1.1.2' // https://github.com/spring-gradle-plugins/dependency-management-plugin + id 'io.spring.dependency-management' version '1.1.3' // https://github.com/spring-gradle-plugins/dependency-management-plugin id 'java-library' id 'idea' id "com.google.cloud.tools.jib" version "2.0.0" -- Gitee From ac07ea7f908fc32b0f3f0fbb2e7bbb995ee4b074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 25 Aug 2023 16:54:31 +0800 Subject: [PATCH 097/204] bump springboot from 3.1.2 to 3.1.3 --- .../main/java/hxy/dream/app/service/impl/UserServiceImpl.java | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java index 72dc8c1..13b2b74 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java @@ -44,7 +44,7 @@ public class UserServiceImpl implements UserService { } @Override - @Cacheable(value = "UserService#36000", key = "'getUser'+#id") + @Cacheable(value = "UserService#36000", key = "'getUser'+#id",unless="#result == null") public UserModel get(String id) { UserModel userModel = userMapper.selectById(id); return userModel; diff --git a/build.gradle b/build.gradle index c04e59f..507d8e3 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.1.2' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.1.3' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() -- Gitee From 8a20fc3cdb8858053e95f6245bd72b536e710280 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 7 Sep 2023 15:26:16 +0800 Subject: [PATCH 098/204] add https://github.com/baomidou/mybatis-plus --- entity/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entity/build.gradle b/entity/build.gradle index c5eda4f..6096794 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,7 +8,7 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-boot-starter:3.5.3.2' + api 'com.baomidou:mybatis-plus-boot-starter:3.5.3.2' // https://github.com/baomidou/mybatis-plus api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.1' api 'org.springframework.boot:spring-boot-starter-validation' api 'jakarta.annotation:jakarta.annotation-api:2.1.1' -- Gitee From b7c03c6d4863a2de270fe6e2ea01ded1111b59af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 22 Sep 2023 13:57:28 +0800 Subject: [PATCH 099/204] =?UTF-8?q?=E8=99=9A=E6=8B=9F=E7=BA=BF=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hxy/dream/thread/VirtureThreadTest.java | 32 +++++++++++++++++++ build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 app/src/test/java/hxy/dream/thread/VirtureThreadTest.java diff --git a/app/src/test/java/hxy/dream/thread/VirtureThreadTest.java b/app/src/test/java/hxy/dream/thread/VirtureThreadTest.java new file mode 100644 index 0000000..d38ffd4 --- /dev/null +++ b/app/src/test/java/hxy/dream/thread/VirtureThreadTest.java @@ -0,0 +1,32 @@ +package hxy.dream.thread; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.Duration; +import java.util.concurrent.Executors; +import java.util.stream.IntStream; + +/** + * @author eric + * @description + * @date 2023/9/22 + */ +public class VirtureThreadTest { + + private static final Logger log = LoggerFactory.getLogger(VirtureThreadTest.class); + + + public static void main(String[] args){ + try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { + IntStream.range(0, 10_000).forEach(i -> { + executor.submit(() -> { + log.info("Thread " + i + ""); + Thread.sleep(Duration.ofSeconds(1)); + return i; + }); + }); + } // executor.close() is called implicitly, and waits + } + +} diff --git a/build.gradle b/build.gradle index 507d8e3..1d111f1 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.1.3' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.1.4' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e920f08..2e68a11 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-7.5.1-bin.zip +distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -- Gitee From b1582d07e50f331605a94d448338810a724b88f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 22 Sep 2023 15:39:20 +0800 Subject: [PATCH 100/204] =?UTF-8?q?Long=E7=B2=BE=E5=BA=A6=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/test/resources/api/local.http | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/test/resources/api/local.http b/app/src/test/resources/api/local.http index a854254..cb35302 100644 --- a/app/src/test/resources/api/local.http +++ b/app/src/test/resources/api/local.http @@ -73,3 +73,6 @@ GET localhost:8080/threadlocal/wrong?userId=122 ### ConcurentHashMap GET localhost:8080/concurrentHashMap/wrong + +### Long精度测试 +GET http://localhost:8080/long \ No newline at end of file -- Gitee From c0e11a0f412b0afd6cd4db0334a015bc5a3ebaab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 23 Sep 2023 00:04:14 +0800 Subject: [PATCH 101/204] var --- app/src/test/java/hxy/dream/thread/VirtureThreadTest.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/hxy/dream/thread/VirtureThreadTest.java b/app/src/test/java/hxy/dream/thread/VirtureThreadTest.java index d38ffd4..ee585f5 100644 --- a/app/src/test/java/hxy/dream/thread/VirtureThreadTest.java +++ b/app/src/test/java/hxy/dream/thread/VirtureThreadTest.java @@ -17,7 +17,11 @@ public class VirtureThreadTest { private static final Logger log = LoggerFactory.getLogger(VirtureThreadTest.class); - public static void main(String[] args){ + public static void main(String[] args) { + + var value = "虚拟线程"; + log.info(value); + try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { IntStream.range(0, 10_000).forEach(i -> { executor.submit(() -> { -- Gitee From 2676ee6ad3de37404e0b7d8e6fd77be1fe419245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 23 Sep 2023 11:01:58 +0800 Subject: [PATCH 102/204] =?UTF-8?q?=E9=80=82=E9=85=8Dgradle9.0=E5=81=9A?= =?UTF-8?q?=E5=87=86=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 1d111f1..34611d4 100644 --- a/build.gradle +++ b/build.gradle @@ -39,6 +39,13 @@ plugins { id "com.google.cloud.tools.jib" version "2.0.0" } + +java { + sourceCompatibility = JavaVersion.VERSION_17 + /* 指定jdk版本 */ + targetCompatibility = JavaVersion.VERSION_17 +} + description = "Spring Boot multi gradle project" defaultTasks 'build' @@ -97,9 +104,7 @@ subprojects { group = 'hxy.dream' version = '1.0-SNAPSHOT' - /* 指定jdk版本 */ - sourceCompatibility = 17 - targetCompatibility = 17 + /* java编译的时候缺省状态下会因为中文字符而失败 */ [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' -- Gitee From 1e906cfd0c523bbd9447b7610e0094e966b431f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 1 Oct 2023 18:02:18 +0800 Subject: [PATCH 103/204] =?UTF-8?q?=E9=80=82=E9=85=8Dgradle9.0=E5=81=9A?= =?UTF-8?q?=E5=87=86=E5=A4=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle/wrapper/gradle-wrapper.jar | Bin 59536 -> 63721 bytes gradle/wrapper/gradle-wrapper.properties | 5 +- gradlew | 282 ++++++++++++++--------- gradlew.bat | 15 +- 4 files changed, 186 insertions(+), 116 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae8848c63b8b4dea2cb829da983f2fa..7f93135c49b765f8051ef9d0a6055ff8e46073d8 100644 GIT binary patch delta 44391 zcmZ6yLx3hgvn<-SZQC}cZQHi({-$l)wr$(CHEo;o=A82`{=2DMR4r-|nHiN46~6#_ zeh&(+C<6+HmXMF0fP)H*mcZcjZ^3=oh$W)d?aE5H|b1^-8%?(_I@L}XSOLppo7krfU)U>F)Y_Ie$H93eGnIXF@G zDvF-uJbQ^+-qK12GskrS*mY5evp|HS9e8sQ*v_iJ2eI=tH~GcKqp{j)-5$_)e7^hl z`_*?2QPAtw4~Qe`8AiYS(0RL9cqHoh!MLMabU;Q;Rnie$A5gk~0%QMjgzn$145D9h zxZ)W@*!Fg>4PK|BM2UQP=k4_df!=n=0p3=nc^tS`ekkYJWcrEG(XGbdpyC9%%aG>r zb}uiuTXHDhtrODkgVwDv@Tpoo@TtbO4+iXE^ zA<2nfAKITD^h?_=T=RJKx-Iw8VqUQ8zX zt3h_@CLFoVShYhV&=#+Rdfi+n|;%QSAS*LTn1;A)Gc1XYEXjL|KNtANUf!f?eVvm3* zW0vM6Mtq2uSW5wW&SwHwYM1n8(|w1CX*?lXEGR!5x|GTwhhmu-P|Z)6()>g0LWj-y zOdOD+Z_1Cq;ex$8%Ni7V$pOA+hH@q%GIC=sI=CB4EgLqNGhLl>K%(jNvux%ziK&ju z01$c{(}JiaZKO_TyGjl6gfUc^*jmd{QbKNAp!Mbn$#)qfv5u%?>x8#AdfHtq~fkDH9_H?~#Hr-Sw(ZkE{yy z$6IzpTeIPcV#SF)g3Dpj!M1)A@c;D}6W{?%ajnY(FCw(8jcI3+3C9^*ug>;`B&dAX z9!hvbIm}J2=ud;sY8ycRS0cyejoQET;Pfpd(7^f)-G7EIQ-0Q-pM8+X`VHQ{YTpCL zKTgn+E8^6eD~1`~iBDmGko^l9uzH92m7+JKW*A+mSHACn^Aih@g#1x4tkAe02fQQ2 zVRpJ)-2JwXYc5e152QAgqWGIQg$fcwFz&NXt-`^%=rt{{)(JS00;U(Nu*{R`uVh)6jE5esH(fLUw0p4Pq2)TEz8U&xPOH>O`wsa6p!q8LP3Crb*U0|Y8)6)2mt z;+`}|^Q~FF$0qHt5pa$nP$*DnW%Q^lS;@6qF_1P4PP6nZyExAE7jmw>nhzO8MxRx1 z*l^`ACBE2Jp1i5c%TZFCZYG9mSVw1rpUnCh)~0_yu^qPw4quQ@gdKn{#Co(3*9EClTgh42^%qU=fA+f8$4 z&smgY7+WxRDObb(rs0NYd_D-L)J)dD;=ZI?z#%4n(092wFZ)XVTqE0P2 zn|K%)tDd9f&#!CO%StA0k~8cZ#M-?yGq#$LN~LS>cJjwX=TFqMnxYrl85r5rBj2_L zU7%Yj=SDjc7HQd+6wCg0l`dIk6$M3X8g)7puBc3wVJXv^=h;z@ZZNaU=b{X`#rY0& zU~&rlNVm)9CGI7b0eDO}Das^oYO}hayFkesiyZq!*H!J7u-U}YAN0G)_O!l9Q@JS^ zTVp*;-wK0BLm%Urb|_FH{C|As@xXdGjB&r8c~Q)im~ znV1Sxu~jXxU3WBBDv(ma_(PiHmX9V~V#oSP;KrgB7-?Z71(+){;DRmtQ&=|YIwsHf zR{coE$-OoMpQJ!Qllx5?tnqqH;~6I|`)KN&tWkTnA{SN<^S~(i8&T*=f)NbCkrPpE z+aRTFt^IatYt4~xW@~M5&Ov~@oq(h`q%W}VWacQ{qbH2+4j@c_$4o_U)H!#K0DjdVa z{vuqfo)_gG35o@tUxHWdc_i)-3{!?{cA6vs0Xw~q?Y{Zd+&lrTPFEd$ULe=6`6Bze zWPqyGT_@KZ7p^s;-`DNYQVSvS-ZB@hu|}X%HK8FGh6^iA$EmDJgR&`8>3DiiTAZlD z7rWDUEAcnjo)jL>#ofSjg)ckJ7Z4O+keEpe{C)_3*9O+g3_nrJRUJ*rB?=VP1WKA9 z5VY5DAlx^ND?!iWjijWCeS=DcBFFkKE4W%a}cMr)Guj06EjOUl~A zPBPiUOxoBZYohbf1^c%X0Z0M<7YG9k{wn|i#UTEjLpZ=r+6`Yo_&>aMID*(DsV71S zfVYl8MTLGFj(!gAEd)ka{@Xc0c!31^M`uzSbCO}henjJr+811wt(S%mW+P+c@$ogS4hY4QrT~0_0>>Cd8#x6@VlW7J`vB{>otA9~g-e|4 z#wl9*Zod}{8j*{@IhvI%y>3~UXmmaYuo$DuW-)H#MV>iRwIJo^qO!WGTv0ye)L6Dcd|(<)Lna<>S4&PMdZJsGiprGzc%0c04`Jkdf*9+GAGPIm$dSZ(e7oQOpK?Ddu3U=T9&3*q9n+E-SL)JRvPLpWy}0;Z&X!lil79 z!}sCbX{Jy-DJ+v_O6ljbB@QO3--!G8koru`MZj#EErr1~hSSC}@=QSy+Kz<+7oa`M zEQ#G?X_`WY;RB{gZ4C_=%FQOQ7BQ$^?Nm5Qm%NK{mchTtOu6uD2)k_yVY zO^P+vQmQ)ut-8Yvl75$xmJV^3>=uf#Cvs)0hdEUhw=0n^L+}1^$G1}bB@nND3>3~d zs;&!&Jt_X*)2FD{k?L-a5jWr;)Qk3^FK%o;A_sAfA%h8e%ROa1u=s4PQ1~(hxidpU z82gkNd9J2$uVAAI2muuQg54y%c@h%{fx%p9+Gea4udb23$ad+omW^kPIa%jUB z6g9eNj$pvsB-sRs9D(1$zl#PanS5kSmx|H3wj*=##rKHv*L5?rX#MviNhSBEwL_}k zMrdSjhQD95u)f}*c~=nKv{sbeeB7T-(Z$--l$WuQv-R`w{Z08> zYnv_KWce44$qre}B^8dO@nSz39sUxJITj0go&IT|wsY_dlj?)%Or?~*8^EsWkZ09| z0oUElYR)2n*lh|q7La9RO1JCRJsq$6Pzg3iJv3?Vx09;y)+v)}LS8qx!;%)eC}Og> z=ZFKh!CU96BjA0>o2z)yh}5d<>{VoxWPKfn7lBPi99Hy6ed(J6&}`H2WB4vjC;(JH zW%eDVPKnKEKbMeN!yehd0iYRdXgXTOLJ1T^k$B9pKQf(JY3M&xhqNJ`!!+;3nj2Q$ zeT;sv6{_!J5@TuMro!5fJg;QuAvaf>amp`45t~8=G@m)lMtX0{ zd$BAZGnCQI6NJ>^HJZ*s3yyGxeCfU`JW0D>3x`(V37U(Ir_bAS0VD9!tg-|Zz}OVA z&M$CH5)SYmzDEivM$Omah@Ex9*@Q!5@-aVzI24;3fMbU%E(TD%>m(z>U25-hDJv}pKG^|e> zPq52BkL8O64JfXU2KZCX6AGVNs_SbXszjxb;A)Z&&TGTP&{2Yp63qrjhcyQklD>jY zScpBsqRqrGg0%H92(?LoQ=ylK5gBNpK1T@+`V}o6n3Hy13Y2ssRn`#K zEx+K)Q}OdHn_bqC5A@FV4V;<&`yTQ?n-flF!q+z_5Re-z5D;Hdeg#>Q`yno1MEz2E zOC9MamYyq?4&?{}Wpj~d8SD-mR4Ry(8agewn2W0hRXb_dw4fcKH96sgqHbQ|OsAOj zIzIXQ#DLc?OhB4i@3;+Tm~)gGz4fLzip0V7z%sagOy#(3hSl6x z%Tee8hw8OdSxl4Ksj{S^U6ZNJe(AQdKA{2sU2DzmN-MFcQ6;{jZ>*X3q7G0SLcVQ2 zKQV8`Dpqrmu;3yE%bM}lYP+d8!I2vDQcM%OjSg2#1>b73M&Pa>{V;ScdgU4 z*|Jcz!Hcx1+gKMBBx!G=nl_gaN3xaUSH2LH@nVD$FHvn)nqd-bsV(ilr5mm5b@iUj zQ|N3hy-QqhT343hq^K^mR*I9a(P!L;?wVyWy{T1^lwUSV?9IA9MUZ(M5X`sEH^@C- zzV+WZ;;MzD#vL_ItRMq|k*)1sV?Wm4+wsIgch(X$c8RBXJ5GIgC_}xN>6k=6JI07G zXG%+yX2XN=t`{@Vw`sZJn8Ay<#+>4ay-4IoPCj8;@1V!ZV5Ha0!#(dS_JIXV#y!0| z9jyZDy;64UZr#=_ti+2kV0U)Y5lWI&Ii{aeHJ1Ul~4@g>^wB>zhS zpDz2WWr_4re$51ROwD-xtcv9Mv)oi|=}DY4Gq-5Wts?G~@94vNb45EcGJpyWAEeS6 zeaF0g9bsuEIn4vGB^Cz70y1DK2-V6RK4%EowfACt!k(P_61c-yR-lof$X&KvT_q}0 z3ONfo#_FcnDdD}1{_}H3QS->SuXpp8@dAaiArk6Yo^;u{K~WOTLHqpxwFM8(Vetmz z`kRfm;VtfNH&t*@*H(P6<;JG+4mLK8wLb!3YSw}ch2IL5UR+El15%@X?R*kJa| z=mr=hN)Bjz!zrv+RA8fg1n&1EB*JA-8KahW zp0O(*A-@Xnj~@tORAFnsBNgYV!a+B3$Fh?#%g9+xLNC5@I^&^8?At<#?)%a%gPcpV zxrFh$kMHC&O=IAXF>9RkGnZk!Wgn#WzNRu5}!)YYum@)e-$NV3Ij_M=J4B zM)7mTaIy|N4X#iGDpb%9ISXuR2VGFGxKB79I%UHG5KsIC`OiY}r}&q&Oj1>{7NChx zuUw}Bys{9=7=4ojwi`=Dc$tDiE;2LuPQWgVr~QhfN$1euUhwV^mO=n4?^|xv)51d~ zNX+I?vB7Q3=Ao>-1 zI_3g7Xa(*w(5RLk^xoQa6a6CI1K>BAylE8oDWNOnH=C&br7jLfD@PEajub(Z*uaOH zqd8$X52p~Od(Wi`XHN?iZ2iF(35MQn8D_l?k9PYxc=^6adPR-+(RqnmOHx3iLWK(_ z&&a)ib%}e8>Oab#2MNk3#zDclg0T`jq!~I8yUGfTWpJC=*vltiZm6nq1{m&sz4?vE zx{%h{bCVmcznwm9{)zBj~ z@F|*d8%(-_%2<-Bo@?1w5~X|WG&6$1hq-l!71^iKkvNZICH} zmF^fGxAuUnx}}-LWTi_iIZ2*;yEsRPwY@!LYq%*{{t2IfR-o+1L%;Dy;cT{8vwWp* zaJP65-1!uMtR%UGE`&g5L8d^BlL2~V4LM0|$X6BPqgmjCS_S~ImZE4x6C9j{3C-xm z#x9yXE>}McL8^{@gP$0XmBGcz39Li7yegrSBA`0|fC8gk5twK={Gnad+*0NKKJvG} zk;B)))ob%rdJ|F&wCG`LpTZxa#s4QC95^y5A zF(Q&328PIk*p=b-YtRrZG?s(TDqI}d6>@&UH zK%A5y^&a*sv5hdH0Y2_w)C8GtHW?KCY^2W9Q+Tk>>yxwl+Y~%^5Expa>5LV{pZ355 zB$E9KCw1d;GgK;;UnaSR8|~wY1t7O`BWoR7#0x^tJVjuMUEd<~d2lPYgxDane; zJhXhfYAex}c05^!3H6BqX5SH7&M2~teoxo%JKTaKfmD*jEVinnGx$_;)1x2_8f0d~ zZ|1;4L!#Lt>-39jrIkvqOh;c!^vkrn^Y{hV z5d-VcRHE->nk)vT%*&Uk;57qi_!pA#_fR2ren|eDt!89(1Z>fPAO+ZyXFg;9aky^nN zAS5tFv&azE7zAF!gE9v!>t*DbsFF7Dx|Hm?>W98!b%n>xdTjK%yz>0m zuC$6et6Rt8dg17JBkvxh>$Na2%~8@&B&^~>Wa#E6I-RGI`=Z`11`C?M;HK4<-5-5v z1_goE6T6P;Y*Y{C2N0MZNE$B1MN{8NwYd{|q{#68E-Zmi8|Vdoe)Y&4pc&_eA6r=z z%3Dt1N@5>}}uqLnLq9sRti z`!K~C&T|e(kBNQ(#K>e)C-**rcWY-k{;?oVcr`gnQt^^`xtyxf>zO1)&4Mgwfjuqu zECs{0O=${19uR=PWDmUNLhItu#jgVZ;atTOEfbC!a~soI>~!YVJIZ0TlL2>=7x+q+ zEquiZ$eJyKgaIq}?8;iaty^_Fr$5F*Y?2EsX7m(RFIgD(6J0em&g>0#HpXRU>Cn%i z%&rAiCW5y{5R@7(K9_sXhddw3r$pKC2opBHZLV3q1Gon*Imzd~=;wf&pCC&PuZC48 z$cnA%)7n~ff8;MRrcr%U(TJdXNNKA%6+M|>r0mLGFJ@Jw2pi(p$kY=U;Z%U4mgG=D zo=d1=&&U)Vl1LY(DQ*Ig3z(C|a7U41Ibww(Ibw)WaukLi9&=;!=G&1_h++$5@q|ja zV!aN*0M^4*nq=~Y>e+*K!%d58(Fm>}yOI3pyODnM_v%-66>Y`Kf|Bf5yChu`9Yqh<<+LQyU7y4doDdr|Wu zr!aK>w77#R)?gqW`9sPhfd&0|{701YsuN^H^;>S__76~$x#jjt0lAtdb z(87_KL5-rxn-w9Ket!6kCzkLlVZSYuk?{qkmAKGvV4XnRCbp`DAf7YDEZ_?9UH#7~ z;MZj6&~4%9o)*$0`d2)G#Zmi)&J|pabWj5mey&)^5UY@cgvSw>|1iRI(Fi>Vp^=k< z$P!m-_WKL1f!sCN2-TE_N@iVc7(U7B2kV}{)YJoAw_Pys@K`#nzyQs?f-OdxQ8?h> z_ZuRAi@=D~y+Jm{-yySmYys52W2c8M0K^We0+(c#_AnCt$f@81^+~PSWkwbwF9eUH zG9dxFU!E)Iwh8suFq7m@{xO-firphKDfx+?T1f3X#mS2Z&dmi4R{m!s!|zfByvN-0 zH!fz03gQNe0xYeNC!|Na`M#!4J|{y}pY=hu$@~5aw{r_u14!bex@-$SG?^M?bdgM3&=^?Q&>_&8|(AH z-C0G)rU@6!Ks6JLhZp^&h&n>ZEYCJz7^r}`I-Plwy6s+mKZ0rSWNaxW$rpcn2>Uz4J`^YW0_4EFD$@yE0?oyJdjx<6zvA9sV%(d82FGr5H0&PqduL&-* z=~^o`{0L&`&c(og08nBx$sXrJ5p*vKrBb`T?IxFIRC_qCT|wcs!Xcy6s;2F9;l@yj zE|VUxH%vUvBGzFCJ=HZ;AAboMZ(tE#!=*N9A&FhfagkN(JHctk!>#4i+TJr;Qu1`i z^rxqRYA3-W^-{YKgXnfbTXV(umafxVnfjdPZ@pC_MbAEg7+^we_W@tOv7K#6mDvdp5uOJI9D3h?v};qUgY>^W9KxJEZ#_nkbw)1^OUb?1wA&uDQiupks*|oTZh%JF=)_7 zEY|wpVxXr^1Au<|=&^=jroBBBW?B5QKDeea2O^PH4_+*aIHv6U1?Z_A1EQV0msYz< zrjzZ4HnCToh4QRHlkq2K@z7m;Det<4q~cPc#L)0eq#U@Um-J?+?=l!$#024c%EGQ< z@o_v;0`fTsh;;wrM3Q!|Fd zkXH61cQZNhDfLJh9Fyi-fF&yENCidnEq=R#00Sykt78zcycCZVaw4NKAJ`r=sw@rD z3D#|}zx@>RMj(X_x49#?DE*svcp;v_w?kg-_68=|x(1;ISST<9eCA*Z(!+1MBB7y| zes|u)1W`NmR!-YNhwjAM!%TyP;@ga(%m6xLwrrN@^pC(4W{~G^nj@5REpSQ7pZ|vg z4!9%7RsO^CFhr738f8*{HAE8QF-FpC0W?v&(_uSVGKcOYd2%wv4Y{2(b&n%8x)^!^ z5x5wQL)LK8YXLo=zX$7Z+;X0o#$%1$JKAcTq->zSJrWw8rd0KqeVD1JFyAmvojf%BbzC@bMXa`6DgZU{A{|_gy&-x25V4r z>=bwS(P@`u+%llIMz$?%n3}OG`&2tY0nlNdK-m=tHKNk-9Wi+H4cdD4oj^_1GnnMJ zfO1hvgZ2QgAdl@iSce3=C!N^66~oNFUts&RQrYpIZu^F@A}=Ga{F6x@qq=rZT~SUN zP#n9IzO(>{Q{k~U)*R`M)zMUJC^vzgf^!MTsP4X#Z7_#kqivz_PdBPh)2ZAsPv;{z z_3tSU@Ghg~wtV@cu&xps0jQ{n?1D2HaLLWEnsZuqM(oT+!12AnsaqlFz6WD`6rcK< zGEM2K=v=Ni=+ZB=q%#H5c>E+qu#z9) z$&#E8Cs0F$Mc9BsSxwQQkxSXFqHhDSuV{rwhZzR*zMArz&@4>mH8G%5hmhWt(TZ4` zb0If*E09TMVXgsn$s<{H#WznkgbZ-im;^{= zRs8_XjSk`6BG!l(rOl?nEOEUO#)u7ad&>f?d+OHKi2>+HW=;5=AtF10bv`LCG{Qx3 zsx!2!m(a; zZqj$@drgukG+eT_cMo&PR~wXJZgd1h+?!A}YgL>)c(;!NE}1RW#+Z8|XZ-fahC4DZ zTV(9w+H9Man`=;vJUW&DC`R_qbDTXHK?0L-&aAph`8FTK2qaSvhQUhYdG=fers)K> zcQC!8EjQYOG#Wnrgb#@`Iqnt6o~cU=5D0??&o{6bqMx=X`BvqT>CYfObvP^ z>t4n$t%J;i<9s%D*#kTHtoDieuTZ)OoW4AV_ha~juj=SIHs4qXGoGgnnQ5mTt}ZdTO8og z^;Vr?%PKvo&3UpbjSF*Dll_S8m~U-0`vPK1pAOYdVFUtOuA3mg5D9x=hx|Rp;<%Y> zHDZcw1crI>m#mo4l6+q(j6dQFP}=|A*~u!n>Pg|bWXV_9yG0!sz>XkGWEuIgrqgK7sl+=)9R$UcAM3m@%WE~d= zOt4Kb%f${>7mL~KjE?KPK0yFz`bZO-w~-}TDVwPxiaB?P6+EX=W%@#XA(^OH_y*cd z#5y-RqAH(hxKrOiyw2_)KwihWW1CTJNbfbrAM8YZ+GhT=Wbmz)A+gX2VGG@|vi4b| zI&ZhA0*4Lvnv|SBr6+wyS+V3aUhFs3E_)d6$I)Rr?)~|7lYw?vECwC5CmQ$!U>G}@ zQ@MLgxB_*&sah_!O&9E0+ci-r4jqJ={y(My?D1Bb2e7=B++UY400-q9+7RP5ai29| z{m-Y+HZpwlI4tFYwO;l6^n>S+4}m-bv03qV7SezB*9!d-d%*JctT6`{>Sf^+IbRth zFI#AFvYXkuw^^0Zp))E6HPS9VJCjhCKmZlyTUZFAV`fZqn>GnBdZW8}#NVpW>5VPZ zTy}yjf{PBUGf^D@poqLHcVjpHz1QGutI_tHbVFnJ|A9NN!5n^TAv*TQ@~t1D4;^60 zqW3SRoYSG7szKec2ga{0x4=1H_Y!3i7wm)kc16dboJnlX#$wKaKF0;(S8e1Nk6hTW zz#}o2y(YC!ei?W%y~vl10;P-KQb{nUHr2!tIVQ9zGs0Q}098b=$XXZ13-j2K(x6J> zYBKo~<;vg@y~7vv<=f+tkWaI{W8*{4_nI7^6`n4SFr18$l@<3JcODnCIgt`@o>d8F zc-AcvqN3iCkQgpfgP@KAKkXddY)XDp#-rF3SD$^kCwEJ`9f545)8Gql@FvxcyB6U) z^C6)hE&Ngy+fD#Q)+Rs=H&bbknm{mLKG!mzq&7c7(H0V#BoROMN7H`x(+v^lEl}Wi zM*L5J$JV_*r2gYnp5XsKry>C8DWD3W@w0Ya4>pEON~kse)+{I)SN;V>O&tGkj9Zz$ z9DlZ@$YJKRLEiOmjvGL^=X)N-7;kC(w6bR!?cq)vDQ4q)wjIaqa@$eH`gyYT83&YF zUs*)h#N*mwIc}4_RA8*nfXGfaZr4~EDh5v;dK`Mac|Z}A$auw4j_v^1GsddisC{mB zYqofw8_5;PILKT>nytOF!}dtD_B4cq%g8yJf7$jv+p=#u#K(s<2+o}|RMlI1ppAtB ziE_MTpL58RGq~bS-Eg!`s+SntNt?-q7Oel;eomQ$(05O-d04U!{@3x9db9u^ z1RWZgiT6vf(Cxl_?2k+LC3GX1i~4&?j+%M*>AXWb*STJ)lBdqK2i#Q?o!HcK>oy`p zY^HdY`e=0cIILE0=j!nO%Fcij2zSdo%^gnTMo3}zY!;?aIDp89$1a@BU$1~#w5Snd ztR8v#(0`6#Fg=tp=d1&vC)=}9xo4grF>enZEQqs|%6(*;#Jl!Xdmg`pEU3si*8|s)eyD!e|a4ZU0XK@bD8!I{vDJ>tLcqI%z z88eHGVXUwf+#;)!PVj{`o&(K|`^o=;-56!Qpl`?BakKG-U%`ow$Ex%ag2N?oQXiZP zWS0IW8SMl8Pvm+|F~WlVLvA}55D?3ME0c9~r~o~OMME@yd1^FRm)|TqU&iAcShy=Y z*wGXya$cn$X8+Ss@Sw>2GVUdDB)bW!HyJ=74rB5r+7%fNr!;^IblfTk3d~_%>%tqqKSz zgXzcanz+rkuV}?jLbib$a7^p{-p8kkx*0=l?@T^AQ)u;XxAk=gc6zqQb&-WZ0V9Wu z4bNu47WYM7M^Lz9{nsY+%E*wOO)4Jv923UEzAB(6MGVe71W*I_WHvBQ3v_@X0YK0( z&f5J3KEmaNu=O{0O`IHW$Ws8a)c{UP$;U!XS*IYgt7TzxYfAn=c)Wzqd`>r~42;vl%2pPKHWN}2$VBTkw2>Xnq-Ib!mohk)I%3Wp zHcP?ki`cT|j6dYu(qy))T_5FdB}QcLj{k=JPo&&x4tMYTLyFBm{Xp=)krMTXAc?q< z8@dPA0G88!`wX(lq%jZV|1$a`z3||~pa22U&?GsIp(o`RASdy)zyNesQvPY)=M!^` zS*VoArpQ|1*PhS;>BCw%;7r5v{lo)WP?6uZwCZG}6J(+F!M`@BWeVgpvoMsYn&}3l z9HE)aGL&J=@>K?#&C)YiWTs?|7J-FR-*5a9={8_Ez6(5VyI!+h=J=;P=KQ>m)*m5( zWYfOAEQiW2?lZi<>Hrbmcr14ssP=d)_kg$U<2y`3Nl%*9K3s199Yg##O74ynnI+4nU23>O>vshvmHIH0vw_Xhls+Fpq zM#UaR7So1^6+kk*jOcn&(;0Y6(~5H=v4zhGUP}uOYT9^5rAMwtDh=pLrZVM}tQNzm z&j|>PNSb61HSMu*UA1ab6j+&F)?k(C1Aw zC{Cq*;Vy2J7M~d0MggZdhwR(;IUeA%} zG7ROYZ-7*LI9-hLvv5cebfvD5UF8Noq%!q`4OLSoIlt$@5}8#>t~7)C<7yo5lKul| z@IiX?SXUH8?P0qS(1W+hU*$tDlMn;(;Y}MMIa2tc#Wm`_k` zE*}g{Y$$dWmJtw{!tP=wRGJC(GmD1n?i{>61OPJx*kIv=nU(>1ca_0yS(i@lc7nM( zPK!_l2{?K?iO3y!FLj!MoLiS4c(g8L~#S`iuE+w6@a=2G#FkJWuO&$(ExBRWCJd{w8y@ZAoI${kn}M z3jq00{USqiB^)*Q?;141b>~!dE+ef0>~DK#}{p5LCyRS#$MMr)wVWP_Z(kh z7R>~>WPIcZj*SIVZ>}Qgj+gSCYQ15nzF~7>N)`Za_+^k~eWQRyI^wzdq0DWLY&viO`BIWbu zJoLD^#g;fn`P?Lb(O*&$*gWEy&}OVfY0F(KXqNpyXeH3vXwV^7;`l%t#yqguozQoa zTj!JqjqteCqC#1@(Ivi%KJXu8=76$Fl)2E@KjtUd3w{{daBkcJ1$GLol9J`ol|t}CfFNi5^c)7^9SttQx z)p+@LyRY~%1o4opt;+Z@5IpECtYp&P7(dW`O~=F?azHW!skgA&uFM3H??*MQc@p7* zi&uNUY{sSnjR1#F^sjj}DfgF))PLgKY{NIw-0$j@Ndx3K?9d+}jejJ$me1oLjqR?) z-6+Wi6ZIbQi3RKLY5`yKi4xw_nLHSDUaH`&HqN%rT%^7D)h(uNwynn!4_F>-T989W z(QD~@by#%o4bp!SHk4N4Dbc=@s`(cq=?l$eh=x0xO;9Jl2xy4@;GVrnv5uE`A z<@lBtPn`Fvh+A?e(ouO-VL!`>WvYv6^f19g3GIUO%gO7lLjai}u*B9UP9C;y4zZ)3 znE}r#fb>SPGc4!6xJYj6F}BxgJU`7n510)E)dI7x2^k*ZyiI_jj}6iEwP;Yxb0 zxe{+U!-00EmSD-3jmi)-t4MBBu?#g!spa)ojm=hFIfBwnij8tle{Mr{%JL zQR>Kdpnt?i4`6BTLSs0h_MbDJbd3H=zsuigOL=-$c!;{<*Ndu}b3wpN1Ne-|X0-#Qiu&k-dI5Cs%hjpR zYrv+e4J6MT z``4=H!7yC!7c55+okOE6KQYhm_4);s`I%HbnB?+opdjmLswTCV5)=pW*uhpc*&aA_ zP*{AM0$8{j(pegRTv_aZUSIU{=%NkVCw2=N?ilPV#5VVgSsWYy;6 zaU~g_R@l^1=CdZBC8)hXM+!vVkCIkQxhtu!K(?(rtt#+eWXWHnH==8M3A?wG?^X^a zLyX4-Uy>XYgN9j89&@BpeLL%*HD_nizchlo0~qEkAQWWS78iPH%2%l+=e(cIghw`# zf0B5R6MBA;dcB-;BVtw|g!Dpar4vwa#&>QYPDvV^@gc`vg9IV#GCR z1d!V+&~;>q;5V!u4=hZ1@W)>MGq?guZ7pDnLl z*G-(${bk!nYc3%84M|zCnbwo!h-x3Y55RbFaij%w7d?J&eS9PQcS>55tV zhLkKYoiVGje3UM|30eTZRiP#(m~m~zU|J-WhEnW-yhl1EG~XL}`TW|6(^HKW2Dt16 z;=ZFDU5M+8a88FN@{e!)`;(-v>BC&!iW`J0Ep5gax-7R7SJ17|?pynfMX^roP^llV zPYze-oc6x0ht(jG`_uso)5YWr8R~AL8f1*G*QP_TUtb4HdEGBn{L~@k>x?<7>gAiu z5KTUyjuO2Db|UaP-=T+PaPC9}3y?a{XbzpbyPt83_`@F}YmsCXXwD(Zta@`t2C+13tQMzS-M6kbv#vJjH;9&~C-8BE)~6V$ zYXI&OAr%ls6$pztvP>1S1SBX~rZhlB65^I%5p$zv6%!a~1%=xVmn_DX>qew+N4N7u zB6tPf&K0QmhteLi+orTR#e6|;9joXvhB*fLhGZRM*-t1zR~r9?hAYx1_yQ6nDPxh>0#4&~9#k38I)f(nGD3yLjd6ver)Y#f!v6{JH!~#0xGzS1q{7?V zT>}j*Fb*%q-q*{Wji4#D+tMBdUGptb6}o4+`X|(Ke~!<&P5DV7t7=_XZ~iKF60(B1 znIS+KscL})(V(-WxF1aKj0rNFN1Q-Ep;#I)Dmmg^v&Ptw1MY8qy&cj0+A|jlp7?_@ z<3xl8vrZph`8uhCyi4m{>HSL^mZxMrfg#(EiV<@XFu4nTxsYp*;KbqrI6xV(Ju?&v zxO@AHNv&PyjG~E`_6|;CrJM~;oP&+H*JCo^RbGuToZ2Ei`MLt`xGfm}tfrLw_7eQF zfU%RVuti_)3`ntZQAPejf$&m!M!~q}GOkQX4?!y;PF8H7qBdm?p(7^4icRJ-&=;PR zUXd~Es+cbud}g9}>)z`M^JX0)_tJ&;ZTrMIJ0od@!Kci&ggxG^Sqkk%DoSRou zrJDI^ZK}{srHH*8`Oeg$b9XfFgRH@pJB+KL(tD!gLuCZW(LukB?J_!1u7hu8XTFsa;4J#|NGyrI*G?=a=( zDX}}y^+2$j^m>nrf7xcjbiz1F3-jE5Vd9yx2w&^N`Og6r{U?q&!qS7a&FF;!UnWuhu=yO4w8n!KGGul+z--3IYZ zGXvhb!OZudK~p;a22k(>b__2Mab-YxqnWVvBFyp2lXmztfMjFl^iLlP{rhOu^~GdP z^#ovFp}ZFDa1XBuyYAT0oT=ARxy2U+)~;Nff4y&P*_|ZQHhfv2EM7I+)nDZA>OMC$^o;#Ky$Q&FlqokC zCwi^9zkzTA#j8FNy}8P!Mh0I-t}mfG5$8O{P`;Ngr4pp4=^WFz#%zX6mW0$EtJ%Zf zT!?c2Jsl>8hX@pXZaaN28qjBJlvHt?PtI=fnHCH-H>*iyXu6P{0r#2LJ=|M$QsJb* zRlV=T#06|**x^bE$@j;Uh4$vW+oY2;?+R*ToqyfaYW)EN`k;Kr=Kr!z6xU(y)m6s` zNU$>d(;n6iX+&R>^1Z~N_{A~Ms9hH@taDSAobNI< zvIl~@(^}~+-Ue)qtU#ih8Fuejbmxb>UIxYycCW_FQV0?v`uaeCg-xwk-`^ODVzUwsoX$_qIJH2{%Ok$D=R6e^$YM z>W#obeR}__r%Ay+huFFK|8N2tFU))e`>y~DT%`Y#q&8!8bG5Q%1p9BVA%Ok=^V-VZ z)y&!6=)b@FZ>tmG6p3udC;1)mDLG>Ozx}9a|$gKvNSWXF>_`xu{CmW zNm13&z*R$g4+S@e0x_xp4G=Wq-hr~~*xtf21x@M7HKo)XLM38)VUC&E?kuR&*#Ue{ zdwE1aZ<;_kBDGA~^F^F<+ca5;RSY79P0sk%%h~06%hTzl!N(Uzh;7rExN+?0{m6(a zjM|L!$sLeyvM|i@z137deAl#&=8QWhJ>AI*y5FgWKrQ@X(AOUMnNjix4D5G`!-F&(YmHhwEMo{K!yBBqN*E8ccqbDSu5Q7iwtvaG}6j{&uZ#VAJL z7+^LKDa#mPRSeR$;apDPRKfOOg$#)!(Jc;j#>{(853>QzkQ4?g-I(B={XyhfRtuix zsXer}-dRPQZVb6&kz6ugv{Dz1EHdach7hI`OE$*ES#&51wQ_{x8gJK5gKI3%nj*e) zs9%MI`db$Lh=PRM9O(QI)NK7HZ4NnX3-!;Nd=`0JI`^c=Br>kDR% z=7Tdkn8pEcI4%vE;3^1RboVb8Z~3LH$b3|VZ0&3_ko~%umt0C`VOlPlP=ImxzR@w@ z-3$dEO1<}2Tkl-y+GMD>FjY|vY^iFhz}vlNLL-Cj+5wl3?zVV{j=hP=hNSIlGANO94ppO_cqfQGU*%dMW;_d zQqPVmY|#`}fi+uERkjyPXL9mNQF}`XYp>w{EWayh5A_Lumfx{Ii5h|b8zyKt8#y|f zIg47kxH?-If8vmXy_z#%3v#gkgo#hU`7eCPQL+0ZD3Sb|8Fh8yFvp`vNJ{dX1Na9S zhjCDYGSku6vKOwLeDucl8a&$Up`WX+V96367Y9GN$)C&G`nJY<J8*Pa&hk;{6Yc@GQ_qJ(WkgzoGQ0`@oc9*-MUCJH}F zmDl@OR_(K`Jh3o7oUS5?Ez-9xsOS;J^qR>NYH86e2~=1nbaQDCOMar4*Ti1dg*965 zL)t>VI7bb)81Ey~00CPSwp`^{u8YGa)y#Zv+in1Jv|jYB-M)|~TYtv5Tx(wP!N}Vv zlPtnYVVmV@>P&45BZ8GCYROGLyWBs}hN7plg7>ATCWXkPDf6 z1d(N1n{(uXM|2)(SBLC2$f908fm@5apxksKyA01T!ZS6ZA?Ta>K1~P%Dg_gEi`F2T zz0zO0Qm3pf@QZj(uz#o!QPtRu%0ISCE>~MGebP_e^uPH3FDkL8ey*ZDiRr5(Afz)^ z^rLx(EMB`F-dI?TEFLy0p8+W=f?uxGd3e_Io8V9=yd>S@7XcWjGtqA%n0gZ%BiSx) z7hSiv%MXNKa*YLhS?p`}+yi)9PfgZG_zC3#Q!LgjA9VAVtn;8e!@MfNYlqj$Ip?p1 zRy~~KndifAMa?PaPFQj&`8nr80HMb*EHgw_EwsqpBCeJJOG~rNild~Iq=?4ZC_ax6 z6GysV$GlcKjXnzAXhcb(a@oE1v;s+lX2rKhB~z*n7-n;DMcqHw;C#*>k~6Gn>;Ew( zOGo2r(0q_WgTMJ&qpFcWG*6*AD>km&CrCAR5}j(cDdj%55*mN+Aoi_>0c@wVPt2XI z6B8OYgQvc;)WmfmAzmrw`|S=xoB+w)_}LXdP*)y1DjJEk3nBh7YNpX=TPF>>1lEzW zuEUzxF~-(*bFq8{=cvYUZ&8j z_L*(%!U=VV%S@I}k4lIxOOH9n;mQ~&y>tp)s^1;Jv6Q84v9ncr5H33v(KP5YbJk0p z?ou>6hUg0=YdBru{!gG8bEfozhWPRY?lYl_J_#8GBT4=%8t`AJ5u>i7fvSP_jv$rJ z1gB2|BOIuiPlhBpyQZG68bdXcpGw6sw}voE94&7?mjNx}@Xwxc+V84Hu&*0jTm4+8 zLmg1j(0Is@B7?sEW|Nb#>XX;i^LGC8VN~$r?H#L^`jw0{pg20ImCA@CTn2?FA?V9Q~| z&X;I+fJk-MQjJcl;SZT3wjYT%mJP}c+*qfPBW*=h^Q2wqlGWr)Ha4UITl2(@LMHc= zBU1_Xt8_*ESk384rF^2|*hJ-XqqWsu2gx1pDGu-yULs4I_glwW{xHHPRh!P4)~SyT zf4v}1OpSFe)|z`G(->-HFU5$dJ+ZyWz8qSQ{U)Nx#7f+MEXmS*FR}EN8Z*xNFLi$c z#V}kWrt=gXQYzSe7WNw7d5|^obF~$h@4VBze1>&w64Ti^Q)^OdLvp23#3Y2sc_bFX z@*v*p{AZ6gsPy zJL`By|0O!Gg=)}y~`UB=~V8P|GsNKqrZE##l@bXOhnYxEcB`t7uJ&{*tJ ztLZSMjVrW>M?%0Lz_3)AVmKp$x^z>eLyG|PN7NO#pHe@I4@p9gMO{e-c9AV|Bp5pW zMyNK3VN5ZKu@%uwS)r-u&_g38>=OHUX7A4E$5&N(K-GZD_2F-zOS*>EmMtWqR4-Cd z^~M|0Q0h4U)5^e#FW{>Tqoy=_+E=AL6+PMEgPYh?Y0YjeZCO zmfKNP1Wh{`^kc$w4{D%vt6#xGRyoqVs+=Ofk=(VwbPs?*Z0~<%UxfX)u=68`@QQTc z3f4Z~ehs9hQUZ#>7auU1Y=WV2J6%0`f3LEWs>54M(%3GM$T~x>!FQa%mAOUZ#Hq3y ze5!bMp46aId7)G3_X68p4DvW=OWFb&@%76co-C^yPXB4=HtVX;+becAoVZqsdyg?B zNWeQRFVok~2_5}TrQ0ok-qgZeN`krK@JN({R8hFY-d%I`u9Gb-Fkj%vP$&6yQqS{{ zt?cb%JdIYQVMI?R`&TR3uDjeoYbpKM}V3rF)isSV+jlId+z9ur^!0!+-$miUEr;QZM9 zV5IAYJ##X!`lY`X(LG=fGVsXRs9DJsYa zX=#bjPdr0Xz>VliPJE3qlAdJ>y+0@k>qWDN?tPn(CnY;GO(f_QxeKuAlW*F&?!xJl zChFJC>>qCtZE7Wg_q~hdiQdVzV_|ziM`o4wKTVU}&fZQi^k*a}PIJVTiH~z#BL&|b z`Gs%I>fM<&&l-rEGQVT;?8UwH2t~fg^Bc!)phPzLKz*T#aEBqFKnd0TjmjXIVE*GQ z)bR_eXOwcGqrEfH3o=2r3+xB@nbp^3h{Mfi1EMjZ^sbi#s`sX9@0HALu~&uVp4IZ4U>zK2r~VhuK{(&w1PL zU#>)$a<&sbN23- z)OU+b{1NxbG5+Zq?@o1EZT39gx%-XOkrw(EeVg1}{S00KFj}N{_VI>STsRM93nWj< z-?QkUhEp|2%gu#l2VPK$=8E)bx%zX2oLezvI z8eXPLvsRUpbE`i_-R?)Yc!iWYPIIEe^S!qHfNN!E|4agn087hc^uXK1TZxFfzrN+% zgtQpAVR*Ndd3ds3SkSZBh3Xsp*co52KbEd&G?K{Ebx_-)Vm2C}n=_!CuBPvNO98E_ z@?A6MZ~I}w-}6l9LomYZ+~lWJhc<+Uqr!>QQx3OL9eWmrl#WFYzj=XTY~Di8 z){?Xho~J+beJsvc79wA8j)wTba=0w=VK*VCibi_TWs$0&;q!1cMMis}7_jd)eDjS~ zd;O{{HPKTUscI;J8FMa14?Af;^NNedB?<=|h`r2EMtI+l?~vWYVDQ^arXLcEQg_H( zd(Wi$rDxGyARksLYNdh;l{^gZa)ioprd3O_2=Vj3DUTj*7s+1kcj>#SeDpY^FOXe{ zms;{EI1cMgr@q(3Y65Cp7oLs**(j6{q_Gtn6mGxVGgO2`xfx;j#2SFG?(BE?n1cadeueLk`)Q@4aQC_{X;}n*2L5|#1See zg+%KfM5>M~s)+`@6ia|H0wrUd?Pi?mCgpB5Cu1q+&e|HCY|0s|)Cl>=z6< z@@c-EcQ;P50Vma=iMO|*B_ciZ=2p6L(us>MiFqGT{7m``epuX&m}5C2u3x|&u;{8> zLf0*{9{tQqVzYTdPzZD<@2I4Q&c-`^HARxrqd?CsQo#NokC3c68jU z!Wk&mJhFXRB{R@FCy=FAk^@Nbmn_o&TB1MdM1U;7CTnHYcqhlpvz$_faP=dBtl; zp;Betj&XZ;xlA91zJlH|)OVW1Djy@H-!y25pM`2vq22!Ni8iBhvpKt4xc6k_Jej*+ zE~g2;!R^pVL&h4hNe^g&`FUzo92R;aUeX?eff4R?1~NyVwi*%vm0y%}qjwTB89nx4 zC|q@8@{#(AW8>iNb}|FOYiS(_Pg@K2Q9~Jk%}R<}I54qg+QYG2s#TVj-3Vzh?=~rq zfd)M#9LgPtPr#6Y3$BR$eTM>S-AN?_Da<ku;vfcBuqg@D87w?UC7Nfoc_tJ7csi#cY z(j`$3gPbIXl7cOQ;e3NMW0zCS(j@f_Au3aoFS&n{q0xxrFEeW=k>IbQ)TFLQ4*ZP# zxyfmSYk36BS~oI!VzFZ(@2nqgt+C9wyuM`irF+=qQr7`mk;f}j>gr~_*O0L;ow5Gp z=-j1DMJB2H6bD=f4f!SsCeV4utwRmb)7Z~ztUcO4&l2yr)a#|g%sf;MTWjDh9eo2k z;I7?4p#!TN`od3mitq@5?C3S4PB2oTXCJ5ELrpp;o9y6RO%sWel@~@TvJU<%vulwT zg-k}0{E`C{*g4h4iAOQW&?%p2xI#fcU07REvE_Rzw@axaPKMe@=-DO2Xn*WY@_<^} zsXF8~I)WYSZujvu3!h=*%aV2`FC z5568{6~^@P71qgU$jfJr=I6O=Zx~@Quu57a&y(ETR6^;jt!XHM@VG7U9ljL~q~#e2+!e0;%x|#OUa3ww z7fmdy%WNuJoW;-tRQwJj;neX+PgF~ z&ls>J)a*p(;J<-wN0BHcByHg1Qy#I=Ir0{#h!!SQ>vtW6NjfwAv?F);r#Qx|?r)gUlFw?ydt^-6e zrL8(~rf=f2EPRfHb5;7)e6^wR58LJ**>W{RAoDH?z^Bu;f>3ydVc7*h=H}xW{#H}T z2Xryh{}j;~6Z?#=Hx@d2Dmw3_cF z*oni5=9-zvR^lbl*1jQA9iqeWQzis!BStx-JaMP5+8HsC-;D`y4qK<75#NG6PCF&` zyI6iH9MZb^=ZJ4FKHd{_N7gMp;c)N6;}}$3!0<|Jqan5(D=ViN_E zv%e)5B8S?88d@PlC>TrsUFc+m$7%0+I?hB(FllXV|7@_BU&_VTS@QwQ$?_Ijatmo& zw}s2tO&Av9!-0!qV@+um>u+eqj&)!LLCYKl%SJ8zsxw&MUTi5U>jE53OSfWppLsgg zIqx6Nk1ozmPT-na>`t^W4fm!*3SDT@rL|v{>l`jOk&iZ(Vk@kTY1TJ7j`z0y2^mW0 zeE&m*_Q2c*N=QIPe!Q!dbS-uwvqlK19_Cka@!g2zaIX*xFE-jRiPe%NxNFv&)nr03 zuf)nL_4Mm@(Vvp%Y6D1`5#N}r1DFWVPE*&#r3QlwhV5POM27-*Bv+y-3z2q$HWnA> z>ACz$AuN(ZY94bXT{R3GCnCxA6#d+o@SqZ5XaDJ4+nzLY-+P`c|FHslfZ~$1)m!VEz^K^dlZmGV!rmG}3A?3UJABMU-LrgvCCs~KnW7r&TgBX0 zjznD(z@aQB(GjhAV!GOOaDV@;ORt>K=m!h}_>Wa-2^Xfhm9`4M%luC#5;{epu<6uB zkrKS|LH!~jyqwlaf8tk_m?B@TL?o^IRbpd zU!|$gd{d^gm3+E1Ga8z6Whc5iWW;po2M1KSCNr$8GJ(H$7-%n4v+)KhVN_Gp zO;tz)a)EF#=v3~|zd?pvBh46VjCh<6 z<}zv!!7Z5$J3Fci^pmGm$74~;e8I=euk`juaEKBC(K+T5+W!7No{H#Wmfh=$ zL*eKxoMIg{kCxy9S!rUJzd}JfOO|!e-{{4%3xUNmBesXyzY8!sq6Z8sXm*@M1^J4T zqlIJ5F(kSPVn^ys!iP=O_$Q$&B^WyuyvS)(4#5%e*e%cVsa&)@dCrUKsjyYFX#%kz zC$~V3t?YfY?hJE{L;gNe7oB*jKPOtoh}k|mX6DrVhp~faxcW|Hsr+pmJX|!(-F?D4 z05I!ym^;1@&zV+wNk8v^2;tK(jv7u@7@RstN8=jVE^G(%$Pj#a-~-1aOUQYo z?=6`bhHrJg&oi+?6`LF)0q-ve2<;={_%Z^&cR;U3!GisSW|=96Cx%xek42E%BeqvY z$9~y@fijnH)>y8%oAxs=M*+efGhcP30COV!I~c@oP!kex?MW9bN5QT$`4UG;hSq3L ztwy>xovrgbFHcF594xrwvIASJPPy+hNalHSk6(l1oagclW*FgfcT6A&55FVxF&e-t zvhb`e*Rno>5B%#X{Ro;D4f2Ly18YNCdSMf^y^``D+>sdip0_()I;DDbDi$Q#4akHc z?3vJT=%Dt+M`pw99>lG&PY}jE!oTAI`k5o~MsEWY`78^66jIQ7z#DtCmk7h?WW=V! zlrN@g^d!M#PG6mPub-0sUalNjwMsZ zQ7ePg16oKxZQ`2Ue{QGl)&l+=fCNZQqDdrwWAO#^_ZWX{uEILK#gW`Cy>T9Mdw(4k_jN{#H~ zMX~}Elha}cWhD>MY}18-+S9~*=2V#VFWy6-R}OpeT>|dZcPYl*lzbw<_UiT(w)9PB z`QK-BATu{+)PG zgRPa7m<|4Yl6YK|33?>xOS)i!IhLi+7_xhU<&|_y!0*b(isFOi@hh7BP4LpjPkD(>f$4Ly4n`Hu^c%z5-p##h z+Uwx-L?$?(WQ%fDHQjoOIi+wm*a}STZ+saXr9zw%>ypWNOjX(p2U>MK&L922xfWhd z(@o2-``&!`?mP$CoWi@U8~qyU3fnw>6qir9AJYUW&Mp809x^T6D5<>u0p_GHY?hVN ztXHHFB#%mW`Q2c3t4opahN+&0%h3Y1*md|f8!@*j7tmIaS%3%^Zo+Np%pblin%;S@ zsnUxJmzyr+-uWzIx2tBxTfHS(Kusg!9O3jXEwI-5{&^`oF&Lbcgpb8R3!+tCNSY2i z)bYOTE&y=4;F(l8x_xw`dGnQI8*rYSI4L#Jv8py+itcxDr;*~Ny$yAbJI8?$H_327 zX*AgDp3t3=QCk{IW}PT#q8{(1qx_qlIz<0MZPRnU1N}pY?|#EwZ1HDjxwlVMdIyOF z`7hPTj==InoWtR6e%e)Xtka2&pXt^gF^=GO$}K?57i&wBC636Sf0MOTw(M~^%86D` z#V)@261kOqOT09@{T6^0NrZ?FA4U>ED-*vz=46qFMa(u3eC_jdxFu18VByH;uUw75rK7+#oqC?f zJbymWQ~2>^*ps@*Ahylt7-WfP)ReRFCvi1XyS7SD9Ac#0F-Z5JN{&$cw2yN3NmU$k zMq;L_Vf47@j`?0^+?gD*Di=yQ-E@-+kD0zeVdhP`fAUTWct#U&JIVi^>=0Xt3WHZkR(|#i(a`Rjjolybh)x{* z`J+cNdh#@J#5K|wI2y%GzoeDq4n<4Go$c*@5f9@qRQF6J<=Rqw&Y+qpJztjhkP|+!8;vl?j&eZ)zKAo4Y2EyO1sz`w8kYO4&JgPG8Py& zVFvqr_s*Fy1e**sI8egO0d1-xeq>8zC9C6ev^1%Y&uP=k*!-faS#11#z^f^yEO)Uu zZlROtNqY49LEskD+izb0XldVmX?VEXXY2VwRi#=4VSR^{l9wL>#?B{ffkz66*RYU_ zFiw^URF=|9`)2JbOT0ouj0HWBr@z7ZEkOs4Gf@T+)bfj4P#jlZ1f{l<<-9@BTRT7L zZVgFkE32G>h;oCK*k#+;r0O|EZ^)rxr7Dw3yUm2j{dO5Dd4=HtFv@b|S=ZW!PBQud zqq>{ixTzpAy&b(+`9yWunX#lWOSdE&^AieJTX9U!tn(a_(UYVH5Cme33S367dJjY^ zG0vCl7Nft)nPO>uMQNl(7x_Hi@QF!Ma!sfSoKV|{Mwe9Xh@|VWL=X`3SgC$_MbiUR z(Ar;Z1Z!WtxMBi;fjfw2lGan9zo>WQShHXb{@4Nxs*s_$`h`w0-TgHl=yfLDg~d`?}vV}U$!;KgZjx*Zq1w^L)K7#t{etu(AlXp+Oc17cSH`hImC@w z)?~FK<3i$xZ+)mwYsGITm!uc)n!w{_gaD^g@L%_j8;(9e(zsJISGyEy+Dj8zjSP1u z|DqP7d{1jdd1EHQT$U@g8{Gq19Tl~{(h2R&vD68kroOHtrk;B=2btA=jjDH$I=p8G zMfr=V+GzIP+d*VvrSiR&wi-{C_i!ZQmM~;0-wWcF`0YaWuR^r5gC*nI%0FCo?kZgh zjM*yL#WDzh+*WLf*47pogs)g!!Ue6gvca24QeX+``)hm)}g3z{egO-I>Xt_wRzg{1WRp`hEwZ2~;h*BfXO@7{MeS zhzo20Fe{Mzu9J%;^pix$yb(xdeL_0T|DCckwl~6WQ^JGgi^qSicVYkvxo_Y0)!o0q?=iB%Fq9Y{eCgHYcJr+70Xi}ME+-oW*Y zfDwd5P$?9>>itd9&OLSd!&k|~;`!c9g%PI@FQ(I=l|*?H`eU{wk)E$YF!es6dOSg4iWL-j)TH915!^ESbfP}H>0(=siFu^+r3;ZPNZ`~Si@7s9&7^WobG*~ay z+#`a*dF)-&dY`(WUTm(c*2^JNi66zj-yME?g)b+l`jRG-ug@4{i1x1)a@U3ao8*}r zH60TsT2ImT{trl=toMLiSXP(gxI0QuM>LM+!&1Yukzrq(@L!?&k??p=Y?a4+)k2U-;gTsP83& zhE=pytYl8-4^;P^J0adn>|bFMiUErGl|HpYa_fe=_TOTIXNIM7ZIWAsqJAdQ3k>YO zDzzlbCFn{6Zxu#KGBI@uaZwA8p?53iel8)k0YM?FfnN*qP_e#jd;_yLP%;#{Z36@I zwlmD{*9#M`Lc}X-!ILuhc4qm^-Qq@bv*s*tZ`KB(y+fGZj7EFT@)>3&)!CM zYOgg&Fw`0#qiU0HjjS9WwMFq>F|#`*-8%&qNOO$OHIi@QI;i)${Xba*uRz(tf=}Jp z*yqjs5AuC8`NDC~!0Yga; zZKztbrJ|GiP6L#N|+Hh2V~Zk&`EP#Tn|)c z1Wb94E!SpMN~5QEyg6udj!f(Sr8Oq{)^OUj+HJzPtD{6})s|&Z+~Tv+4e%E9Le~vz z5~z?@A3cM;tOyhkEjW}>nZbiX$t9dKez;DZLdzS^BOSVmc)$(A4kC>d3k}jmC1Nx`7C; zFnmE05dWB=iu8zr-oEKwNy=5A2jUTE)Z48tafjIpZQhY#euPVHUylo;yxcDd^ph6B!JcRkp zV2>8P1-#q*7;w0%>Gf!>FnnpGHQ^p-WpSpyw@q*28z#8at+6WCQa{k|t5r*?Gu#Gi zhKUI<`zzC(u>X)&CPIN<;o}@|5E`@dVY|c7%L}na`_{lb z_&*i~{l6x&DJ9$-GEs^sljcgKmgRmjbRA%;6Aa@p`1IK#W}RzJ+P0BNs3i0EHm2BU zX}O!x%Ve_o58RuE-jL&an>5oo#VVT;3{l?8Ml63{y}4%BVQ`3$L$_6=G{a`C$ZJtO zL8EcBlLj*9lE%02j2)KVU+MU{{#w|0`Mawc64YDJ&o5Ohs%i9)jNk|7raQKc{!6L* zMKyHn?d5LJDTqPq?$10ofM<1xLvnvEN=Gw?#RurJ14?!`vRwJ`;ii^ zMp3->yhx`ca9&C3XnW`k51H!pFnD!RRd=T7!B2Crq!;Zr>-}456_i2jX<-FW*y=Kr zi}PxNmf8)_r=VUPdSp%Lk`=ikp0&&#DKYV?SW5k04>%;A1Gu%$f7dr^ZhI5FoRzkD z*=oY<)=PgFmAG~e2v=GV@&dW2{6^_#fp=Dw^5#W$VKfNJeUAO@P}%enwk*Xm^A6ZI zzrxo$PCHZB%p4b`oVt~b(&=-s8MG?mQVC4ctIYkMl^cBB6d$ogs1ocKQ_k}tNc`OGx4?Q=Ira7K`avl&DR5A z69MPy5afUI#FWO^!%hIaA}h3oHAR-(Y+SCd@&R_tjehql`kKSh8l~m2Uwiz;4UU`F zB;`)l-82#VYjOrMBTgJNSta?t%X!beJ<&`q>CED8g&C1^rhiiMQik$7D z&y-~Wi9;7R1aB(_hbzahPTs$>e~nbOHuWQF2%-^IGasNRJB6@luUfy2`Fe2WB5On{R8GkfheMZS)yuUIN`O`(IGsYn` zSEm>~Z7HnNmljx&LGG3td=5Wz>K$k~^$i1D{TE~i|Herj<`8ttYpj&3|G%?iTgNb517hYKY*yF)Z)qMgw@P z@_Jf7$^#6@yoh~$dCGdyo!m|wx#j8EDZw>j^iMEITzX@9S?B4g zzV+z5Bi3?+1vJ$C6u>=)#-qgSUao~sUwA$OMlGWUQTrTQYnRXX4E)3=H1)W!;3VWGBk%U~FQfN1& z0!%4e#L(}uh#&D%4(pmeQ*-FFv(|QB5<)pB>|Kd;@nkO?o61I_nI~-{hrKI(jQeWq zwYoSl&MrAk7UiswO!@U@yAmAPR)*Lpmj{QveRMUC5GlNE`Tzq7O{(eXUx1;^0UlkZ z(Zwko;vmRp0=}SLYkk#fcz?1_Qt?_nCrV^M2{RzuM~(_by4sAV;||LiUnkMS!e`c< z!a}cU+%$6mEi#=R%n#q()&?oqIM>pGsgoZIcC=;lSoSW|a7l~XqZ#k(h7YfaIg`;+ z*dBE0A~*SpQJ2yAh2pdj9gq$sM#>&V7Y8L)B}Qo+IW^%_DmEeqgW_iNqFHVt)ZH@F zFN;clgUqVbRr3p31*V_G*l(CG2l#PO+OR1*zO9x8J6zL`(9Wbp7+J!hFm7Hx=@Ih$ z7ndhkF#WCZlRh}&K+Wk|#j|CcERCn1NN?C*;^H$D8D#6&yRZ1N3+O$v4*ia#Xhzg9 zz&fdetfD691Ds0z*S&+oXPN^ATJ1fM=mKI1SeY59mu(v(-I(G{H8v>TqNRc9yZH&Yx%TRR$aPR$Ft z69OMoYPQJCnir>D0-DR9imIGkD0Z#%%vWU7Bd3-ufuy#PAB;nTn9?IEPOcF$*b&tc zNvvm!;2gqk*6whK|0wrY1kEop&-j;?j$T=F0EFxIq6T@FV9gWDJ#sxotgPZ}ZyTm1 z6AC&z1^INpH>tzMb{OUo7b3VHznLCi8;lPcNl6hl@W(V|fwhbK8PU2n#5ZCgl@^lP z`@VZ~ov3~DLm|3ktZIA6)^A#;ApX+1s3ILjx&e%Y_dsxW=HSnWDjvwM`hBAD)QEp- zHWS8&otpfK&@h16Crq9XSl&!1z?L@5OG#;ZX z`CHK*!y<1OfGk%>GOH&&4{nj4c_#HbOr)f4a(AICAMWKC#Y8q{96~QWTIE63%k$*a zkJXZibj&kZIPihWng=cGF!2ElxFBZ0p4Y;=Musk;BFWuCVR1DWeocfw!O)lpvN38q zWQnUzd}3r$bU@%yOyrwU6!t0X&_2eI^&aYlXCW;Q5HHCcR``n;=M!Erkg~kem|uTx&U(ryPUKh^MM(4R&w!!cKL*fn8m3L@*WG~lKh7P5IyscK6M1ei%!m^LANzLhY9l|Oa!#v zB18hyL*s0Gq5 zmVoJq$Zsuwdd332J??_@(c{%8=Y!}{5a*Th{bwJrD_A7Y6DpMo)z*Xa%K6UgIf*s| z>;PASUx_6QY_EDeLxt<+>foM<|Lg&`g77#H_}(GiaU~Lr({SE_`m$4s@AEuJQa_$2 z7T|tND>Y&_TCgak>%C9#?PKcx!+j<6mm{bnt$r(L6-2qegboGi`8yVrs$#!})<1ui zwXSqXO7zh+GPZVFp74Vu3V34{&_3Jnk$Yf=iV&+9sZ*wgM-VQsfm{ND4$x3B|CTSs z*Pj-G?J``YT~#U1Z{tQkJS)vSx=or{+RJ^H);P`_nYnqC>&0vimmvMxQ{W|>c^H)% z<-A~1Zar6w&Sxyu4RvxySvV6PwF!xpZD@&VBx0Ayf&JqIBBj9Mh%NL7b_~2Ra6p#} zZ&`DKIE)gi-pgvZS^UqevKGA`>=y|ri{wY7S#x$6tyspIs-5;+Y;z(D(%4L?jQ}XC z;Il1?)|#zemWibcI}?vW7UHcHCHC64)ys|flm{~%ZzCz+f*xAy;goQ$5b~gca6v3= zS!TqE+8fT53WMScagLj;m-vqXAo!i!inuDjrpb%LBRk9|OO(bX}C65f}NBsY37-2jtZ^=k<7E!E$`Ql_b7 zqHDcm0mhAH;Z~xz;4xC@_ZgnUfrLq_X=aoHbudjA_*RYv_MYe|MRvU5&z|E`@=!F=^PzPXE88ny8M*TjAPYk>&<%mYjHq2MLE`%HbWtP+?C+CKbzdvtXO(D zqNY{VpjVLaB^7r>Sr1o+3ThXzwY!!KEpfr0#^!{6jA3l$(b>HLZ^vuuOpF1_@^Qme zBvi<5=dPgja`uxo3J@>IhNa2824cXcCTMPk!$t@0T($RdF;6|uP3esKD5%$h z9=ofGAE-Q0db!n^p4N`YbFKYIm2w@i(0`Hd2VOPl#h4G!g)D$|?7OCx*MiaRaef|x z)frMi=U5G_wQ8lw2c42mVSA}ps3@~*&F#a(WK(S+2HZ~S2dy|*3N(HjlbH@K?$uAZ zqHJvzPPH}pr1-`WlZ$G`d^lSsrF9X`^(p^`psfq2rcjijv?TVEw%#xxaWP9QRyl*_ zP7{0vDBOT&54X@Fr%sClCa-4_wYcvclXeYAOkJ)MYO9*DeiB`O(mkD|wVy89+TsR=kiIE&EHi#X>G=NK5!7EBivZiO zp~oS@BZE0gZv;suEw5%hsUXT(%J>i|gX{7gM*fQb|LN;1z}ncJw{drOcbDSsPH`w& z+}$-uaVNM-a4QtIQrwHv;x0u4v`A_D<@Q>8f8X=pJWn<`=bf1&vnQL~oq0=NO45AE z)iv~Gt6Y`=NA-OlDqat-J!=U0PNd*-2Y#ij_L$wHl{8*?xVQ*5LloRAK`o&}T$E5> zPe1XrZv8xG2lD~v%vGLzJri;RL2gk%sph<5TM{nvg_AZ{rq4BZyE}1}WBeQCp%-E< zU%>IZ{G5_XM3fO^N@^Dq%D&!nZbT5a5VJz&<)#~F`=r`Y(ax&%mnISf{k|h{DU@+5 zjLG=3)~``R1c^!NQRPdqb-tOil2m3McBpAH^Km@lj_@uO^^q*zA;gb*Dje50 zaphV@808H!ni$VFKTrS+GYgDY>`h)bo{>%~N$wunO*tXu1<%sAO%TeqNxW&STl6TO zR^+O4D6Z$uN3{eO<746^L|Ks#H#g^ZUk07(Lz%7ej+kic*|N}`^55Ep9Im1Y^4nA3 zYl~o??3Z;PyI6D~nvrb8UnbiIW$k{&y&Ye?tE|#+S)AoaSK$ME?n}PVhj6;U`VpF6 zM0g>+AG{CX>>P`|3vV{}$V^PB?VUA|e2)SAj^#fwL0Q_<92Y%ir1yYzK&dAZMDd<@ zf5a1Cuc4UP3&qbs&67!zQ4>8Fn%0^??U6=I7GyYpTbt=tUY&V$AbE*}UZzmBCF37= z9d}L5lRMd`_+ST6wW}s8jfG|`1j2B51q3x<=dPO`dOqai9}Mbn$wofcm@B~x)TYLp zGZcMZ7OR6wuo7_)FuZE$7=h==dW9 zFCjC&aDasIkaKXVaaNyw&oyO0O`yKc_-Z`(tgMc#fVb(9Y6($vxa%tg%T;F~HS7)5$yw-R z=X`LvxM3Y2L7k*T=$!UhdvNwsFc$-MI8#IZG4v#9Mgy~sd@NM(pwl|D3h}VvQ z4(Gf@nxhmzWn3H4vlu()a;=S-p~0E4@GvVwSzpG)ry;Ry5|crw!8>fnINanA+GU4n zb6L)HUUqsy^GIb<_iPQ_Aw+P0;TFyRwFSADikS?mp_2Vqn{qilc9pex9C8sI6{j6I z+m$&_HxEK4QyDWvF@cVrxISowm6N>e&Ro&US-1iK&D2BE!aX~WU;1I1LZwAPoY!M! zfOsPV*6FiTcH->M2%@|Tp`5evdSq9$A5_r}&Bk+OZzl*jm$tW#eIHuvr`$ ziAs3_QF0H6wWF$G#90cFQIj?3(R7wLD(WdJhN0Wvi^;0MboFFD-pW8HFI|gLxD7Pj zq%9i*Ff1|@>>`OE5%rh4IlSspjU6)())LBa16v^SDfai$Pv@mKFRQKXE_GceVPUS^ zS#LR`qs_v`I^uGV9qKldKd+cihtzc>;k>>y?FvIUk?)EShgw?)v2CE#&Xk=`gsaz? z%5zqK5G0knatw#|ygB@v&gGH!Z#SJS*bxxq&8 zUDx8vgT3esC>Jg*%UVy2{Iui2<8IjA_ILIYFsh=GYsWsTQj}`crG!#owr`T1k2C37 z0G|qJi%JwYwQ8E=7Wo2)&7m~V;PT7k=v!LSjs_YqnkrXScc zGI5)leu{w}CXKddm+@BH?TPo6q`I&Ou(qp4ckUd!Wp;c!DUfajIRSQp?Q^OGVZ^pv zdx0|6QroEU?bC?Vw^Et6ogGN3jBBW&n>68)yy>!!f!u26Z_c#}yEF=-=qsMW)syzAhZ z@%U)FuNXzzU5A$)^TUV=W+{mPWsI;+rI*i&i!BlZj2u>zYF-s13E*)dml%akiIGc* zk(&2Hp)f_FWKw%Kgp0(f!P9hXBE@ifs+^jXvUtB%F zR9)Ud`6E`%fFx!qOA1XxCyKUXTvkz50V7o%-_UOfnO^K(IXtp{Lys!}$Y#xNoltHE z(`v0qG%bgTt<1hX-YTXUF_3;_Lh8ozcv7fb2_BY|VU9N-b4IeAzQ}!xt*bL7T=bmdu4Y7E6itUOyb6O&W<(@2GiIY=UH- zk2{Yz{5Ty|wLww&(bz%cOiM$_!kA<2vPR}v4f`yvj=m_HZLQrbfVI^P@yan`Hzjgf z=Ii}Y?Ib;f*K}@saF`q~WyELAQ7r0-Qh8xHnz5oxlkOadgiV%~%0cxqt8a~zjBFvC z2@A7FQ1#j$!ZLAdd(U*dqtH7W+U;=IitK$Ja^^7fR5iHfSQI@(P87yOU)lJ24)ZRL zB7LU14=`dG0wvd{16W>vFgfeWI(*0Yk)nCBKv{9~Y}LJ-RPzov(GpwR zPci36SD1qtorh+r7RFp5Lm=_W5S`lL-FJqT_Ru$=YJFNCIvTHxLZE|PYoa*u3n^R7 z`@03LwPPi1BQYiItQ1ztrSuv9GC}TRAF*M7n5Fz^HTxOIeSk$%(#XR-ZyK@En>3m^ zZOPX+!(UL|q7FiRvO(bb+}cf9uGn41g(ARo7LD6a$YDoXkzM5&vkRT|o=-Lww&fj5 zKEmoj;Crrf-PQ%9^9Ucr`cL*sf&Dkn)NW292@SdTZd%aiVzG10I% zKN|cSE5i|Zylv^@PNbJykuwL?UgFQoCO;_XHx)JP1|#3>sO4|bOxCABlg^2!B2iCC|u8 zlBRSKL<|lOnwe6PJ=LsmnmuEt>$0 zLuAg(K60mQT7dFKE?Wq3d@^?1pg1iR)+rNgoULmBXjH21k=IqITNDW+bJZ@Hx$*mQ zN>w`k5f)9$_ufId?DG916zz+)`GFFs4(rw5*1v?1 ztQ&Z&1$1fW42HoPbJv~7;k14a#KU+ZI`~HT^Pv==)H?AS4a2lQo;gW^e0(yVfc_{jC2KGEFu%z!hpt70-I z!#)9Dp}U^17lA)Q?#_Lo^51>qQn#!pcTe{-z?2#O%%vpY$8@8CT>@^N0oKF-YzL3~ zNgz3ybEplTS_hGK7&y0f&1HtpxdOmBT;lQXBfMqiQZedoa3vQ*fzJ%PvOjJkp)01yqRQ1_4xBpdt~ zr7^|6>Q69DnFQ9@6FY3S>6qXGsI2+axOuEUKEv1U--*A$1@daws-SA$)Gl~-Rxd>k zKb)P(L8s=NUaJY|X0~cMgpt{myF(WcoA9!~c$0b1T#t0zB`V=-&+_KO>rX7i9!+&@ zIdRjYS$jSe;5QvFRIT+TP%08*`?zbBZ| zHE!_MR7|aA^jNS>JTwou39VRv)bPJxf2{Y;NF&RgOVpZ>%j~iqTdJ`DaZD~h!li0Z zt3|kZXW=;t=+-vr`8@A3qp?t9{}?sZwMTnNy0ahnCH#c#?3SjuJTDU({?&DJ_0+_a zdzGS#Nz>r0cg1o+>{EnIA;3$n9wj@z*Vj@)wvatex+U?t#i;=(OV%}CO`vH=;;V=cf+lbPdb7j#c%`DBqI1iaNSE2HG#pZsj8$P*{k`-HF0H`j1I1|U?>Q#~N z)Vy3<-S1JhrrKqM8Q2$4%R6)$oBa;Q_dc%ZE*p)|YmJGiM=`Rmwr=Eu^nhRp%MPxe z?0}Fc&8{x8{gdi|t|$4H&mIOT`NFP#Qzm;Oc0zoa0ZxOXtb2TJ zVA_>qVd9v0;qO$t$vEGKE$s8xh}TS@5e*l^L%$z>>ZyO>AomgMNmaIX zV4<^6e=MBgqO(-fhVLD3n-ILhwwhuu8>UElCd=_Mdbq_w*jU2i}F%vnR! z=&4oWp_U)7wE;|3VHoQTzita#Q@L#LztyIME11f#txMA4yr8vf>XWz4ga z5c|rj0894T;6|QGRev|8dZw4Rum!=5Lmj{uk3I~HhNe*6WbECDu>m>pb9o&^NiEwi z(~j9rd7yFC{M7(2cyyo@j3_@bP|nW?ea2ELG8nUZvnH7QRK#$=pHk=foB(P2zXvd7I+JI)!Ztojw{`9WI9-5`^ltCRGJ<#6_5{T; z)faH5lf^|7-e6sE=eANy-6UUTC({gUB<~{$NIu5hCg-9hCeJ%XdIjB{C#_Hq;rh-I zJl~AGL?68mw>+!_GbN7BCNXs}-7?zKf6CqAR)tC$GKW*xm2{@7Oa%}0#6!U&Tnypz z-Jc@u?~V%t!ry@BWXX4heh^5rKGpUnT@eWDeM+%gej%d|%8L@0K`v2}Sm$I+H?GizKQEyoYON@uf(8dkC$2&VfL8)G5GSJoZKh7#@}V9tcQnwW zPyO85a^g_|i;-KeNGmw6u;9hc`{TP^NUoyDnZjwgHKOjQY{>kagQESQOc_Pm$l`A| zWB^Gp6gg^IEn)0v4fn{4bHYiV^XsU)a@GcBmG|M!m&U&)9qrw|5?BA8dn+ct2Pby5 za9pwoh-SJ*j+?%xU_c2c>L=sSe!?g{*3M>J!=>YVIX7-o7Z!r1g7Ijb7J+q5Gi<-d zx+)V~z}C4RfSa1U==NzYOdng(i6ID<4~;uyq;_ZG9K<9#aq*E7aKi%vRMz;rcg1fFPT4%w|)tvQJJ80^Z9`c= z+f4++PtOs1-3#eX*HzIc1MnFV!1x@aD1FRyntEBiAss+sLU_RYt&m7F{V}YZs@8Jk=eZ` zTDge}%^ZXAnvc2qA>hNmc<1+!r_4?4%UyIJmh(c01s(_X9)X4(O$ zmxK|ZG4G{s1~TbTuSM_+4;R2;CjILBpOrImlQ+h1|-O9K1YdOoQ7vIGwM9cu=eF0Od?MX4fq_ zFv9IbGAhsPi0F7|ycf5E z0khc%X!^LcVAN+Ra=ZE>@eP_rrWfJs6yq0=^UcsKdSk^Rjw4BVaIwIo`lV1iJ%q;FDHU|v5CC{4eVcIgyC!C>f^fruWN>91H=kCB>t#LsW8|3eg* z<-!Gfjtn`sjU|ABV)}V*yS;%3RCB=sAP3>u;{SNwJnj^wL`9mGM)WBYL6M(YY687n zO*)0WbIK(g*&+W-JuPf{#>XcUYT3}Jx|QW~!(zY^Y;sL8J!w2%ZR^Y4#sI?0uYJj@ zkDF7kb2iXo-ahec-Syt}{SfK9+q^rsd@gp670M@F9it!9v5>5<%rsCd+hZt=3`kPM zawF6>rQK}}=}{j#r6(I9rAyyQ#39&@i4jmTh@rKn^A`YYP8F5)fGNKBMEY*A?$rB{ zPWEmj`(E9vA8w4k@qGZhP;3nr-95S|jNWm7{U-V~l#+5E9P&MAEE)6W9{W4l-5y*r zrS->T@ENp(`nBL-I@^02xuErAM8L;&?U11GVBzVh=zCAYA!6jbD#HhfoM}#sCy>pE~U%$Y> z7RQ!ZBWSIOS?wBg2M0sR#B=wNMI7gELc;zg+>EU&Fa4wy)Wq^lq9@gw) zJt?j;ZWPY*D(8i$w9;Vb?sEWyoo1XUuKGl2Rfn&E6lB{-!rShM5bV8I9NL=ru$?7+ zCR{wi(~{U9R1lEQX7r(+era=RG21~lgS(Aywth5yD8<6A$0z2jy)4T@!ACIk8+=lx zf+~Gmqk@vqSLJpGrRjBsm)2n!ngQ%LJ zc1Qb#S;WLwp~H!4rb33Pvl)JGPmRABre)XgWbnSK!(h}VUSM#=2Ge7kRaEUesl?x- zz8Y7tNHZ;e)4Of6(|}+M`5%Bv`9{ zp86h@DQL!A^SaS4-!=b;dQx49;!Kywx@@#>QZBA`Pnp5Jq-@ELDl%^%ebn6bP;mi? z`vkCH{gG?e{uLxfWJ&`w29@dK`>2?E7VFxQ3a`Plxp{k>y!bQ#-W;#IYO9KuyHrUF zPfw`zk8aSIuP-{P9a~C!R&BoZsWD+XI4CGlClFukrf;T*aO@s|qSEo@%vPA{{9?tT zaSpPbyA#Sx7~<%7_V&cVNyfVl^+}Km!V;`bRK1Rqr$MmgdcRc=?v{n~Rz;y#4j&_J zcvXVjm3$q~(+cPf$r;yo9Walhva8H^E_yk`$l(5Ej?CD2!0+UTzWI8WS*QP{pSvU-9BfI_zC za!-tfKdaKX3>U81yRGhJqXkb0SLh}ED5^3ULDeN6q9$(N!^+v4d8U7PP!Gri6F%vV zYzeyJWaEH+iGTD<$UUiyyaj_2erz*iKcCdGg<*e1qsf#BU!*}(+^dgi2#=e;JT<;8 z{<*k7=p>y4urR{MN3obzIAS)|w2X>9_7?Yg7pLIat^HS+eBimKoTH|>5^BflP59KQ z{30-(^ufrX+;`PbihSSq3NZ&2+1LrR7fETC2UUh4?!Ln+P+8PNrFHSh0`0 zs#V_~-IENS`H(x4TsOE`RB*n#KK4G;F-M{0v3iJug~jTY2Q^SXfrNWcE1HSus%9swbp? zs$H%68V8`vJ->J|6`yXAeX^MhO-Lq`qLD%O)|ZH*{q_~vJKbAPH|TFzrlE#j=7{x$ zYPB?VWuMhox-!2HGDk~e`ox-8m>lE(dgtl z5Cd-#B_`C597E7Z{|xqrn1Kh1^&s@PF9~W?yiDqgu@~t@=GG-aU;nv4({uIh4ie83zC>*M%8YF&R5t6K}_)|Fs6$A@#>{Kiyk;(8aGNhd_X=0u$$*3 z8$mP$l{&$aY;DdkKCgj=CQPg7R53@q?Nsq*1$(Q#zF~{)YD=+NcN|Qs6N3KQ5JFzZ zI*zgVg5GM2eEhQ2f;4}v_nS1fGp=S3;k|D2xvo3+-`+O?j z2tPR6rjghcbg#O8zWpZ@wjo2dHXLU$CFdazrvU_~if60gnog0ij_!zUJEq3bdmV*t z!pPO+N3&s!OfQ6%silRZNzwo%-Z)1kFVSAxkOAK1x?AACVAPB#twaW8<<5#^3-b zR`QnSMPyNK%~P?_-zvWBBJmR~nrJ^9Y(L~F`rzApe2SjKvO*G;*f zQ=F~ab)f-2aEe8$4SKcY1?Dn$865*oxfOdw8=6b?R-SKy|$oXqDp|1?{G=(UcVF;_qhA4a#NO{c-p4IkJ|kDo1)mK+ zV{PVg_2KeOeKwgDoqKBQE~b0QwtC44rQRJn>DhlEwCw>C5(^s?&*&Bnzy1PAG?=)b z(>v7FJM^*)zX(I11gf?5b6#*Opie>5@Kj{;nn~F(iBl}D8S8UC`e)AX1E=v6j46 z`_atXB9vs`C8J=Mz}SVOs9-C=Qlv^L6^Cz^N2$22O0Q*nXqM5n?-QX0f(kSY9xPsJ zF+NarnHq9o)MZ%;^8R|68~SJA-7@W;AGlUn8UB4PKk9hJml2Yw*_04MvkD3A`+Eb0 zkwXLB*+_xgtAxM6*G4$pIU$%oSS4ux#zOX>umn_K&?f7jCVDq9V4hHc)0=15BT@n_?KYJS9!%0D+ym=_w*d`k$@iM%aZm>(FB zFT}u)TP%ySs`RyJx#=oxe&Idagc(F$Sv(5*pWd?HYll`LXi*p`s9;8=FNKjA$zuDap z1iJ4_{GzB&FY7I^Z=V2WPV}duAN#+$7*g>}M-8M^ZIIB>-^X-D90KS2pYi;cJpI2t z9+!d$Z~~_e2!65t2V*tx>VN>IOBPZ~3v6t}2DR0RaAz+Y0&>nb^fj?~75%>lATlV_DagaSI48TP5e#m z`NUsBkeiDL|BMZ$&97r4JO2|SVnYrr+W2*{e!H;xn_8U}Ah!z{@Mwehm%07(!p~pV geSU+(twG={1R5&vkYyYSN)YnO$AzrH2Y-C~e^Sofwg3PC delta 40281 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 \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" +MAX_FD=maximum warn () { echo "$*" -} +} >&2 die () { echo echo "$*" echo exit 1 -} +} >&2 # OS specific support (must be 'true' or 'false'). cygwin=false msys=false darwin=false nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MSYS* | MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar @@ -87,9 +119,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACMD=$JAVA_HOME/jre/sh/java else - JAVACMD="$JAVA_HOME/bin/java" + JAVACMD=$JAVA_HOME/bin/java fi if [ ! -x "$JAVACMD" ] ; then die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME @@ -98,88 +130,120 @@ Please set the JAVA_HOME variable in your environment to match the location of your Java installation." fi else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac fi -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. # For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) fi - i=`expr $i + 1` + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac fi -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index 107acd3..93e3f59 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -14,7 +14,7 @@ @rem limitations under the License. @rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @@ -25,7 +25,8 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar :end @rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd +if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal -- Gitee From 9037d807fbc9a5deaaeffa6ccd73c9c219476324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 6 Oct 2023 11:15:56 +0800 Subject: [PATCH 104/204] bump gradle from 8.4-rv-3 to 8.4 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e024716..86e7d71 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists #distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.3-bin.zip -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-rc-3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -- Gitee From 351c872ba945f6b125076e34b5130afcbb1847c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 7 Oct 2023 20:31:51 +0800 Subject: [PATCH 105/204] tencent --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 86e7d71..ed9f603 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists #distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.3-bin.zip -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.4-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -- Gitee From cdc7ac1285c6fd640ac3ab0cae362b8a2418ae79 Mon Sep 17 00:00:00 2001 From: aohanhongzhi <37319319+aohanhongzhi@users.noreply.github.com> Date: Wed, 11 Oct 2023 20:06:57 +0800 Subject: [PATCH 106/204] Create gradle-publish.yml --- .github/workflows/gradle-publish.yml | 45 ++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 .github/workflows/gradle-publish.yml diff --git a/.github/workflows/gradle-publish.yml b/.github/workflows/gradle-publish.yml new file mode 100644 index 0000000..3e30133 --- /dev/null +++ b/.github/workflows/gradle-publish.yml @@ -0,0 +1,45 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# This workflow will build a package using Gradle and then publish it to GitHub packages when a release is created +# For more information see: https://github.com/actions/setup-java/blob/main/docs/advanced-usage.md#Publishing-using-gradle + +name: Gradle Package + +on: + release: + types: [created] + +jobs: + build: + + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + server-id: github # Value of the distributionManagement/repository/id field of the pom.xml + settings-path: ${{ github.workspace }} # location for the settings.xml file + + - name: Build with Gradle + uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0 + with: + arguments: build + + # The USERNAME and TOKEN need to correspond to the credentials environment variables used in + # the publishing section of your build.gradle + - name: Publish to GitHub Packages + uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0 + with: + arguments: publish + env: + USERNAME: ${{ github.actor }} + TOKEN: ${{ secrets.GITHUB_TOKEN }} -- Gitee From baf6abc03ebdb84ddbd4d81fce5490c19e4bc09e Mon Sep 17 00:00:00 2001 From: aohanhongzhi <37319319+aohanhongzhi@users.noreply.github.com> Date: Wed, 11 Oct 2023 20:07:30 +0800 Subject: [PATCH 107/204] Create gradle.yml --- .github/workflows/gradle.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .github/workflows/gradle.yml diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 0000000..2c7d933 --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,34 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. +# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle + +name: Java CI with Gradle + +on: + push: + branches: [ "springboot3.0" ] + pull_request: + branches: [ "springboot3.0" ] + +permissions: + contents: read + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + java-version: '11' + distribution: 'temurin' + - name: Build with Gradle + uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0 + with: + arguments: build -- Gitee From b1d4c07f38eb6f60b134f79b1008380301d2afca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 20 Oct 2023 15:46:42 +0800 Subject: [PATCH 108/204] koTime --- README.md | 2 +- app/src/main/resources/application.yml | 7 ++++++- build.gradle | 8 ++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 291bb91..5a02de2 100644 --- a/README.md +++ b/README.md @@ -133,7 +133,7 @@ https\://services.gradle.org/distributions/gradle-7.4-bin.zip LogStash | 日志收集 | [https://github.com/logstash/logstash-logback-encoder](https://github.com/logstash/logstash-logback-encoder) Lombok | 简化对象封装工具 | [https://github.com/rzwitserloot/lombok](https://github.com/rzwitserloot/lombok) loc | 代码行数统计 | https://github.com/cgag/loc - + ko-time | 轻量级的springboot项目性能分析工具,通过追踪方法调用链路以及对应的运行时长快速定位性能瓶颈 | https://gitee.com/huoyo/ko-time #### SpringBoot支持 https://spring.io/projects/spring-boot#support diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index baa96f9..9aeaa94 100755 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -64,4 +64,9 @@ server: info: app: java: -# version: @java.version@ \ No newline at end of file +# version: @java.version@ + +# https://gitee.com/huoyo/ko-time +ko-time: + pointcut: execution(public * hxy.dream..*.*(..)) + context-path: http://localhost:8080/koTime \ No newline at end of file diff --git a/build.gradle b/build.gradle index 34611d4..40eb4e9 100644 --- a/build.gradle +++ b/build.gradle @@ -111,6 +111,7 @@ subprojects { repositories { mavenLocal() +// maven { name "Alibaba central"; url "https://maven.aliyun.com/repository/central" } maven { name "Alibaba"; url "https://maven.aliyun.com/repository/public" } maven { name "Alibaba google"; url "https://maven.aliyun.com/repository/google" } @@ -129,6 +130,13 @@ subprojects { /* 添加通用依赖 */ dependencies { + +// 暂不支持SpringBoot3 https://gitee.com/huoyo/ko-time/issues/I880X2 + implementation 'cn.langpy:ko-time:2.4.2' + implementation 'javax.servlet:javax.servlet-api:4.0.1' + implementation 'org.springframework.boot:spring-boot-starter-aop' + implementation 'javax.annotation:javax.annotation-api:1.3.2' + implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.springframework.data:spring-data-redis' -- Gitee From fac23409ef399e1f42f5c76ca28047ba963dcce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 20 Oct 2023 17:27:08 +0800 Subject: [PATCH 109/204] bump springboot from 3.1.4 to 3.1.5 --- build.gradle | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 40eb4e9..a88b40d 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.1.4' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.1.5' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() @@ -33,7 +33,8 @@ buildscript { plugins { - id 'io.spring.dependency-management' version '1.1.3' // https://github.com/spring-gradle-plugins/dependency-management-plugin + id 'io.spring.dependency-management' version '1.1.3' + // https://github.com/spring-gradle-plugins/dependency-management-plugin id 'java-library' id 'idea' id "com.google.cloud.tools.jib" version "2.0.0" @@ -132,8 +133,8 @@ subprojects { dependencies { // 暂不支持SpringBoot3 https://gitee.com/huoyo/ko-time/issues/I880X2 - implementation 'cn.langpy:ko-time:2.4.2' implementation 'javax.servlet:javax.servlet-api:4.0.1' + implementation 'cn.langpy:ko-time:2.4.2' implementation 'org.springframework.boot:spring-boot-starter-aop' implementation 'javax.annotation:javax.annotation-api:1.3.2' -- Gitee From f8c32a4992b1228eb616fa63f035300bf5b24b0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 23 Oct 2023 08:50:15 +0800 Subject: [PATCH 110/204] bump mybatis-plus-boot from 3.5.3.2 to 3.5.4 --- entity/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/entity/build.gradle b/entity/build.gradle index 6096794..4ed8eb8 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,8 +8,8 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-boot-starter:3.5.3.2' // https://github.com/baomidou/mybatis-plus - api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.1' + api 'com.baomidou:mybatis-plus-boot-starter:3.5.4' // https://github.com/baomidou/mybatis-plus + api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2' api 'org.springframework.boot:spring-boot-starter-validation' api 'jakarta.annotation:jakarta.annotation-api:2.1.1' -- Gitee From ac68b74b1ab00071411e69d94a3cc4ec3da47716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 24 Oct 2023 13:10:14 +0800 Subject: [PATCH 111/204] =?UTF-8?q?=E5=8F=82=E8=80=83=20https://github.com?= =?UTF-8?q?/baomidou/mybatis-plus/blob/3.0/build.gradle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 66 ++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 36 deletions(-) diff --git a/build.gradle b/build.gradle index a88b40d..eb57271 100644 --- a/build.gradle +++ b/build.gradle @@ -42,9 +42,9 @@ plugins { java { - sourceCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_21 /* 指定jdk版本 */ - targetCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_21 } description = "Spring Boot multi gradle project" @@ -52,34 +52,35 @@ description = "Spring Boot multi gradle project" defaultTasks 'build' allprojects { - group "org.springframework.boot" - - repositories { - mavenLocal() - maven { name "Alibaba central"; url "https://maven.aliyun.com/repository/central" } - maven { name "Alibaba"; url "https://maven.aliyun.com/repository/public" } - maven { name "Alibaba google"; url "https://maven.aliyun.com/repository/google" } - maven { name "Alibaba gradle-plugin"; url "https://maven.aliyun.com/repository/gradle-plugin" } - maven { name "Alibaba spring"; url "https://maven.aliyun.com/repository/spring" } - maven { name "Alibaba spring-plugin"; url "https://maven.aliyun.com/repository/spring-plugin" } - maven { name "Alibaba grails-core"; url "https://maven.aliyun.com/repository/grails-core" } - maven { name "Alibaba apache-snapshots"; url "https://maven.aliyun.com/repository/apache-snapshots" } - maven { - url "https://mirrors.huaweicloud.com/repository/maven/" - name = "华为开源镜像库" - } - maven { url "https://repo.spring.io/libs-release" } - mavenCentral() - if (version.contains('-')) { - maven { url "https://repo.spring.io/milestone" } - } - if (version.endsWith('-SNAPSHOT')) { - maven { url "https://repo.spring.io/snapshot" } - } + group = 'hxy.dream' + version = '1.0-SNAPSHOT' - // 临时解决mybatis没有适配 SpringBoot3.0问题 - maven { name "OSS Snapshot repository"; url "https://oss.sonatype.org/content/repositories/snapshots/" } - } +// repositories { +// mavenLocal() +// maven { name "Alibaba central"; url "https://maven.aliyun.com/repository/central" } +// maven { name "Alibaba"; url "https://maven.aliyun.com/repository/public" } +// maven { name "Alibaba google"; url "https://maven.aliyun.com/repository/google" } +// maven { name "Alibaba gradle-plugin"; url "https://maven.aliyun.com/repository/gradle-plugin" } +// maven { name "Alibaba spring"; url "https://maven.aliyun.com/repository/spring" } +// maven { name "Alibaba spring-plugin"; url "https://maven.aliyun.com/repository/spring-plugin" } +// maven { name "Alibaba grails-core"; url "https://maven.aliyun.com/repository/grails-core" } +// maven { name "Alibaba apache-snapshots"; url "https://maven.aliyun.com/repository/apache-snapshots" } +// maven { +// url "https://mirrors.huaweicloud.com/repository/maven/" +// name = "华为开源镜像库" +// } +// maven { url "https://repo.spring.io/libs-release" } +// mavenCentral() +// if (version.contains('-')) { +// maven { url "https://repo.spring.io/milestone" } +// } +// if (version.endsWith('-SNAPSHOT')) { +// maven { url "https://repo.spring.io/snapshot" } +// } +// +// // 临时解决mybatis没有适配 SpringBoot3.0问题 +// maven { name "OSS Snapshot repository"; url "https://oss.sonatype.org/content/repositories/snapshots/" } +// } configurations.all { resolutionStrategy.cacheChangingModulesFor 0, "minutes" @@ -103,9 +104,6 @@ subprojects { apply plugin: 'io.spring.dependency-management' /* 依赖管理,用来传递spring的依赖 */ // apply plugin: 'id "com.google.cloud.tools.jib" version "2.0.0"' - group = 'hxy.dream' - version = '1.0-SNAPSHOT' - /* java编译的时候缺省状态下会因为中文字符而失败 */ [compileJava, compileTestJava, javadoc]*.options*.encoding = 'UTF-8' @@ -164,10 +162,6 @@ subprojects { } -group 'hxy.dream' -version '1.0-SNAPSHOT' - - //下面是google构建docker镜像插件的配置 jib { from { -- Gitee From a9b13bdde579967f0622519de0672df6e978f557 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 31 Oct 2023 17:08:22 +0800 Subject: [PATCH 112/204] =?UTF-8?q?Controller=E6=98=AF=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/hxy/dream/app/controller/AsyncController.java | 2 +- app/src/test/resources/api/local.http | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/hxy/dream/app/controller/AsyncController.java b/app/src/main/java/hxy/dream/app/controller/AsyncController.java index 1a0e45a..a2eac25 100644 --- a/app/src/main/java/hxy/dream/app/controller/AsyncController.java +++ b/app/src/main/java/hxy/dream/app/controller/AsyncController.java @@ -57,7 +57,7 @@ public class AsyncController { @RequestMapping("concurrency") public Object concurrency() { - log.info("请求开始执行,是否为守护线程={}", Thread.currentThread().isDaemon()); + log.info("请求开始执行,是否为守护线程={}当前类 {}", Thread.currentThread().isDaemon(), this); long start = System.currentTimeMillis(); diff --git a/app/src/test/resources/api/local.http b/app/src/test/resources/api/local.http index cb35302..11c090b 100644 --- a/app/src/test/resources/api/local.http +++ b/app/src/test/resources/api/local.http @@ -75,4 +75,12 @@ GET localhost:8080/threadlocal/wrong?userId=122 GET localhost:8080/concurrentHashMap/wrong ### Long精度测试 -GET http://localhost:8080/long \ No newline at end of file +GET http://localhost:8080/long + + +### 异步测试 + +GET http://localhost:8080/async/test + +### +GET http://localhost:8080/async/concurrency \ No newline at end of file -- Gitee From 765ef1606d9b05931d3c1e83df667ac2054352f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 7 Nov 2023 18:53:07 +0800 Subject: [PATCH 113/204] bump mybatis-plus from 3.5.3.2 to 3.5.4.1 --- entity/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entity/build.gradle b/entity/build.gradle index 6096794..eecdc3d 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,7 +8,7 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-boot-starter:3.5.3.2' // https://github.com/baomidou/mybatis-plus + api 'com.baomidou:mybatis-plus-boot-starter:3.5.4.1' // https://github.com/baomidou/mybatis-plus api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.1' api 'org.springframework.boot:spring-boot-starter-validation' api 'jakarta.annotation:jakarta.annotation-api:2.1.1' -- Gitee From 554036bb04b012d8a7920ae716b78561a12af3f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 16 Dec 2023 12:01:37 +0800 Subject: [PATCH 114/204] bump spring-boot from 3.1.5 to 3.2.0 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index eb57271..c0d1e2c 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.1.5' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.2.0' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() -- Gitee From dcd4a261c1c49ea195db6688181ddd6c3f88d91b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 16 Dec 2023 12:03:11 +0800 Subject: [PATCH 115/204] bump spring-boot from 3.1.5 to 3.2.0 --- entity/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entity/build.gradle b/entity/build.gradle index 9df80f0..4f491ea 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -9,7 +9,7 @@ dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api api 'com.baomidou:mybatis-plus-boot-starter:3.5.4.1' // https://github.com/baomidou/mybatis-plus - api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2' + api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3' api 'org.springframework.boot:spring-boot-starter-validation' api 'jakarta.annotation:jakarta.annotation-api:2.1.1' -- Gitee From b198dac896414ccad230eaf463fb8ae7200b2a4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 26 Dec 2023 11:08:11 +0800 Subject: [PATCH 116/204] =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=8F=AF=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/resources/application-test.yml | 6 +- app/src/main/resources/application.yml | 2 +- .../hxy/dream/common/email/EmailTest.java | 2 +- .../test/resources/api/http-client.env.json | 5 + app/src/test/resources/api/local.http | 10 +- build.gradle | 2 +- .../configuration/FilterConfiguration.java | 16 +++ .../hxy/dream/common/filter/StreamFilter.java | 57 +++++++++ .../wrapper/RepeatedlyReadRequestWrapper.java | 108 ++++++++++++++++++ .../RequestTrimHttpServletRequestWrapper.java | 1 + entity/build.gradle | 4 +- 11 files changed, 200 insertions(+), 13 deletions(-) create mode 100644 app/src/test/resources/api/http-client.env.json create mode 100644 common/src/main/java/hxy/dream/common/filter/StreamFilter.java create mode 100644 common/src/main/java/hxy/dream/common/filter/wrapper/RepeatedlyReadRequestWrapper.java diff --git a/app/src/main/resources/application-test.yml b/app/src/main/resources/application-test.yml index a0bacb7..f25db0c 100755 --- a/app/src/main/resources/application-test.yml +++ b/app/src/main/resources/application-test.yml @@ -1,9 +1,9 @@ #线上测试配置 spring: datasource: - url: jdbc:p6spy:mysql://mysql.cupb.top:3306/eric?useUnicode=true&serverTimezone=GMT%2b8&characterEncoding=UTF-8 - username: eric - password: dream,1234.. + url: jdbc:p6spy:mysql://139.217.230.42:3306/test?useUnicode=true&serverTimezone=GMT%2b8&characterEncoding=UTF-8 + username: test + password: Newp0ss,2024! # driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.p6spy.engine.spy.P6SpyDriver hikari: diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index 9aeaa94..d902c34 100755 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -47,7 +47,7 @@ mybatis-plus: server: port: 8080 - max-http-header-size: 102400 # 解决 https://gitee.com/eric-tutorial/SpringCloud-multiple-gradle/issues/I7KZ1I + max-http-request-header-size: 102400 # tomcat: # threads: # max: 2 diff --git a/app/src/test/java/hxy/dream/common/email/EmailTest.java b/app/src/test/java/hxy/dream/common/email/EmailTest.java index 134f683..a877c0b 100644 --- a/app/src/test/java/hxy/dream/common/email/EmailTest.java +++ b/app/src/test/java/hxy/dream/common/email/EmailTest.java @@ -1,6 +1,5 @@ package hxy.dream.common.email; -import com.sun.mail.pop3.POP3Folder; import hxy.dream.BaseTest; import jakarta.mail.Flags; import jakarta.mail.Folder; @@ -9,6 +8,7 @@ import jakarta.mail.MessagingException; import jakarta.mail.NoSuchProviderException; import jakarta.mail.Session; import jakarta.mail.Store; +import org.eclipse.angus.mail.pop3.POP3Folder; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/app/src/test/resources/api/http-client.env.json b/app/src/test/resources/api/http-client.env.json new file mode 100644 index 0000000..67d83c2 --- /dev/null +++ b/app/src/test/resources/api/http-client.env.json @@ -0,0 +1,5 @@ +{ + "dev": { + "host": "http://localhost:8082" + } +} \ No newline at end of file diff --git a/app/src/test/resources/api/local.http b/app/src/test/resources/api/local.http index 11c090b..8fefd1c 100644 --- a/app/src/test/resources/api/local.http +++ b/app/src/test/resources/api/local.http @@ -1,7 +1,7 @@ GET http://localhost:8080/user/get/1 ### 添加 -POST http://localhost:8080/user/add/body +POST {{host}}/user/add/body Content-Type: application/json Accept: application/json @@ -13,7 +13,7 @@ Accept: application/json } ### 添加 -POST http://localhost:8080/user/add/body +POST {{host}}/user/add/body Content-Type: application/json Accept: application/json @@ -30,13 +30,13 @@ Accept: application/json DELETE http://localhost:8080/user/delete?id=2 ### 添加 -POST http://localhost:8080/user/add2?gender=0&name=张三&age=22 +POST {{host}}/user/add2?gender=0&name=张三&age=22 Content-Type: application/x-www-form-urlencoded Accept: application/json ### 列表 -GET http://localhost:8080/user/list +GET http://localhost:8082/user/list ### 事务测试传播机制 @@ -69,7 +69,7 @@ GET localhost:8080/AsyncServlet ### ThreadLocal 线程安全测试 -GET localhost:8080/threadlocal/wrong?userId=122 +GET {{host}}/threadlocal/wrong?userId=122 ### ConcurentHashMap GET localhost:8080/concurrentHashMap/wrong diff --git a/build.gradle b/build.gradle index eb57271..423d92d 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.1.5' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.2.1' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() diff --git a/common/src/main/java/hxy/dream/common/configuration/FilterConfiguration.java b/common/src/main/java/hxy/dream/common/configuration/FilterConfiguration.java index 11b3622..75d59f8 100644 --- a/common/src/main/java/hxy/dream/common/configuration/FilterConfiguration.java +++ b/common/src/main/java/hxy/dream/common/configuration/FilterConfiguration.java @@ -1,6 +1,7 @@ package hxy.dream.common.configuration; import hxy.dream.common.filter.RequestTrimFilter; +import hxy.dream.common.filter.StreamFilter; import hxy.dream.common.filter.TokenFilter; import jakarta.servlet.DispatcherType; import org.springframework.boot.web.servlet.FilterRegistrationBean; @@ -35,4 +36,19 @@ public class FilterConfiguration { registration.setOrder(Integer.MAX_VALUE - 1); return registration; } + + /** + * 让request可重复读取 + * + * @return + */ + @Bean + public FilterRegistrationBean streamFilter() { + FilterRegistrationBean streamBean = new FilterRegistrationBean(); + streamBean.setDispatcherTypes(DispatcherType.REQUEST); + streamBean.setFilter(new StreamFilter()); + streamBean.setName("StreamFilter"); + streamBean.setOrder(Integer.MAX_VALUE); + return streamBean; + } } diff --git a/common/src/main/java/hxy/dream/common/filter/StreamFilter.java b/common/src/main/java/hxy/dream/common/filter/StreamFilter.java new file mode 100644 index 0000000..66135cb --- /dev/null +++ b/common/src/main/java/hxy/dream/common/filter/StreamFilter.java @@ -0,0 +1,57 @@ +package hxy.dream.common.filter; + +import hxy.dream.common.filter.wrapper.RepeatedlyReadRequestWrapper; +import jakarta.servlet.Filter; +import jakarta.servlet.FilterChain; +import jakarta.servlet.FilterConfig; +import jakarta.servlet.ServletException; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.ServletResponse; +import jakarta.servlet.http.HttpServletRequest; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** + * 过滤器封装下request再传到后续处理 + */ +public class StreamFilter implements Filter { + + /** + * 不需要重复读取的路由 + */ + private final Set IGNORE_PATHS = Collections.unmodifiableSet(new HashSet<>( + Arrays.asList("/api/file/upload"))); + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + } + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { + ServletRequest requestWrapper = null; + + if (request instanceof HttpServletRequest) { + HttpServletRequest servletRequest = (HttpServletRequest) request; + String requestURI = servletRequest.getRequestURI(); + if (IGNORE_PATHS.contains(requestURI)) { + // 文件就不用重复读取了 + chain.doFilter(servletRequest, response); + } else { + requestWrapper = new RepeatedlyReadRequestWrapper(servletRequest); + //获取请求中的流如何,将取出来的字符串,再次转换成流,然后把它放入到新request对象中。 + // 在chain.doFiler方法中传递新的request对象 + chain.doFilter(requestWrapper, response); + } + } + + } + + @Override + public void destroy() { + + } +} \ No newline at end of file diff --git a/common/src/main/java/hxy/dream/common/filter/wrapper/RepeatedlyReadRequestWrapper.java b/common/src/main/java/hxy/dream/common/filter/wrapper/RepeatedlyReadRequestWrapper.java new file mode 100644 index 0000000..3d2d6f4 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/filter/wrapper/RepeatedlyReadRequestWrapper.java @@ -0,0 +1,108 @@ +package hxy.dream.common.filter.wrapper; + + +import lombok.extern.slf4j.Slf4j; + +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; + + +/** + * 可重复读取body的请求 + * + * @author eric + */ +@Slf4j +public class RepeatedlyReadRequestWrapper extends HttpServletRequestWrapper { + + /** + * 将流缓存到了 body变量中了。 + */ + private final String body; + + public RepeatedlyReadRequestWrapper(HttpServletRequest request) { + super(request); + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + InputStream inputStream = null; + try { + inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + char[] charBuffer = new char[128]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } catch (IOException ex) { + log.error("{}", ex.getMessage(), ex); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } catch (IOException e) { + log.error("{}", e.getMessage(), e); + } + } + if (bufferedReader != null) { + try { + bufferedReader.close(); + } catch (IOException e) { + log.error("{}", e.getMessage(), e); + } + } + } + body = stringBuilder.toString(); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + // 这里在 body变量里重复读取即可 + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); + + ServletInputStream servletInputStream = new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + } + + @Override + public int read() throws IOException { + return byteArrayInputStream.read(); + } + }; + return servletInputStream; + + } + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } + + public String getBody() { + return this.body; + } + + +} diff --git a/common/src/main/java/hxy/dream/common/filter/wrapper/RequestTrimHttpServletRequestWrapper.java b/common/src/main/java/hxy/dream/common/filter/wrapper/RequestTrimHttpServletRequestWrapper.java index 916dda5..f1e6d7f 100644 --- a/common/src/main/java/hxy/dream/common/filter/wrapper/RequestTrimHttpServletRequestWrapper.java +++ b/common/src/main/java/hxy/dream/common/filter/wrapper/RequestTrimHttpServletRequestWrapper.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.Set; /** + * URL query param。但是测试 表单提交参数没有获取到 * 请求参数trim处理,非json参数 */ public class RequestTrimHttpServletRequestWrapper extends HttpServletRequestWrapper { diff --git a/entity/build.gradle b/entity/build.gradle index 9df80f0..7cdec3c 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,8 +8,8 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-boot-starter:3.5.4.1' // https://github.com/baomidou/mybatis-plus - api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.2' + api 'com.baomidou:mybatis-plus-boot-starter:3.5.5' // https://github.com/baomidou/mybatis-plus + api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3' api 'org.springframework.boot:spring-boot-starter-validation' api 'jakarta.annotation:jakarta.annotation-api:2.1.1' -- Gitee From dde8a414fdde3b3fb26fc6dce764b6f3ec9e7485 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 26 Dec 2023 11:15:02 +0800 Subject: [PATCH 117/204] =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=8F=AF=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E8=AF=BB=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/configuration/FilterConfiguration.java | 13 +++++++------ .../{StreamFilter.java => RepeatableFilter.java} | 2 +- 2 files changed, 8 insertions(+), 7 deletions(-) rename common/src/main/java/hxy/dream/common/filter/{StreamFilter.java => RepeatableFilter.java} (97%) diff --git a/common/src/main/java/hxy/dream/common/configuration/FilterConfiguration.java b/common/src/main/java/hxy/dream/common/configuration/FilterConfiguration.java index 75d59f8..099ceb1 100644 --- a/common/src/main/java/hxy/dream/common/configuration/FilterConfiguration.java +++ b/common/src/main/java/hxy/dream/common/configuration/FilterConfiguration.java @@ -1,7 +1,7 @@ package hxy.dream.common.configuration; import hxy.dream.common.filter.RequestTrimFilter; -import hxy.dream.common.filter.StreamFilter; +import hxy.dream.common.filter.RepeatableFilter; import hxy.dream.common.filter.TokenFilter; import jakarta.servlet.DispatcherType; import org.springframework.boot.web.servlet.FilterRegistrationBean; @@ -10,13 +10,14 @@ import org.springframework.context.annotation.Configuration; @Configuration public class FilterConfiguration { + @Bean public FilterRegistrationBean someFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new TokenFilter()); registration.addUrlPatterns("/*"); registration.setAsyncSupported(true); - registration.setName("repeatableFilter"); + registration.setName("tokenFilter"); registration.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); return registration; } @@ -32,7 +33,7 @@ public class FilterConfiguration { registration.setDispatcherTypes(DispatcherType.REQUEST); registration.setFilter(new RequestTrimFilter()); registration.addUrlPatterns("/*"); - registration.setName("RequestTrimFilter"); + registration.setName("requestTrimFilter"); registration.setOrder(Integer.MAX_VALUE - 1); return registration; } @@ -46,9 +47,9 @@ public class FilterConfiguration { public FilterRegistrationBean streamFilter() { FilterRegistrationBean streamBean = new FilterRegistrationBean(); streamBean.setDispatcherTypes(DispatcherType.REQUEST); - streamBean.setFilter(new StreamFilter()); - streamBean.setName("StreamFilter"); - streamBean.setOrder(Integer.MAX_VALUE); + streamBean.setFilter(new RepeatableFilter()); + streamBean.setName("repeatableFilter"); + streamBean.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE); return streamBean; } } diff --git a/common/src/main/java/hxy/dream/common/filter/StreamFilter.java b/common/src/main/java/hxy/dream/common/filter/RepeatableFilter.java similarity index 97% rename from common/src/main/java/hxy/dream/common/filter/StreamFilter.java rename to common/src/main/java/hxy/dream/common/filter/RepeatableFilter.java index 66135cb..ee20d8d 100644 --- a/common/src/main/java/hxy/dream/common/filter/StreamFilter.java +++ b/common/src/main/java/hxy/dream/common/filter/RepeatableFilter.java @@ -18,7 +18,7 @@ import java.util.Set; /** * 过滤器封装下request再传到后续处理 */ -public class StreamFilter implements Filter { +public class RepeatableFilter implements Filter { /** * 不需要重复读取的路由 -- Gitee From b71dabfcbf785bc382ee13ccf985d3ae162fc0b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 7 Jan 2024 22:09:29 +0800 Subject: [PATCH 118/204] javax -> jakarta --- build.gradle | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/build.gradle b/build.gradle index 423d92d..334ebf2 100644 --- a/build.gradle +++ b/build.gradle @@ -33,7 +33,7 @@ buildscript { plugins { - id 'io.spring.dependency-management' version '1.1.3' + id 'io.spring.dependency-management' version '1.1.4' // https://github.com/spring-gradle-plugins/dependency-management-plugin id 'java-library' id 'idea' @@ -131,18 +131,20 @@ subprojects { dependencies { // 暂不支持SpringBoot3 https://gitee.com/huoyo/ko-time/issues/I880X2 - implementation 'javax.servlet:javax.servlet-api:4.0.1' implementation 'cn.langpy:ko-time:2.4.2' implementation 'org.springframework.boot:spring-boot-starter-aop' - implementation 'javax.annotation:javax.annotation-api:1.3.2' + // implementation 'javax.servlet:javax.servlet-api:4.0.1' + implementation 'jakarta.servlet:jakarta.servlet-api:6.1.0-M1' +// implementation 'javax.annotation:javax.annotation-api:1.3.2' + implementation 'jakarta.annotation:jakarta.annotation-api:3.0.0-M1' implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-webflux' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.springframework.data:spring-data-redis' - implementation 'com.zaxxer:HikariCP:5.0.1' + implementation 'com.zaxxer:HikariCP:5.1.0' implementation 'p6spy:p6spy:3.9.1' - implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation 'commons-io:commons-io:2.11.0' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2' -- Gitee From 7532600f8f081c975080d3ec372c002442999691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 7 Jan 2024 22:14:57 +0800 Subject: [PATCH 119/204] bump gradle from 8.4 to 8.5 --- .../java/hxy/dream/common/configuration/RemoteApiConfig.java | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/configuration/RemoteApiConfig.java b/common/src/main/java/hxy/dream/common/configuration/RemoteApiConfig.java index 403a007..9c2c58f 100644 --- a/common/src/main/java/hxy/dream/common/configuration/RemoteApiConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/RemoteApiConfig.java @@ -14,7 +14,7 @@ public class RemoteApiConfig { @Bean RemoteApi remoteApiService() { WebClient client = WebClient.builder().baseUrl("https://httpbin.org/").build(); - HttpServiceProxyFactory httpServiceProxyFactory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(client)).build(); + HttpServiceProxyFactory httpServiceProxyFactory = HttpServiceProxyFactory.builderFor(WebClientAdapter.create(client)).build(); // 后期会自动扫描注入,不需要手动指定注入了。但是上面host配置肯定还是需要的。 return httpServiceProxyFactory.createClient(RemoteApi.class); } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ed9f603..d742d9a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists #distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.3-bin.zip -distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.4-bin.zip +distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.5-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -- Gitee From ee6486e454f499525af21f1fdeac5a55fd5532b2 Mon Sep 17 00:00:00 2001 From: eric Date: Sat, 13 Jan 2024 22:48:04 +0800 Subject: [PATCH 120/204] bump dom4j from 2.1.3 to 2.1.4 --- app/build.gradle | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index fec4e26..cd5c9f2 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,11 @@ dependencies { implementation 'org.springframework.data:spring-data-redis' // implementation 'org.springframework.cloud:spring-cloud-starter-sleuth:3.1.7' // 已经不支持了 - implementation 'com.yomahub:tlog-all-spring-boot-starter:1.5.0' - + implementation('com.yomahub:tlog-all-spring-boot-starter:1.5.1') { +// exclude group: 'pull-parser', module: 'pull-parser' + } + implementation 'org.dom4j:dom4j:2.1.4' +// implementation 'pull-parser:pull-parser:2.1.10' } test { -- Gitee From 786439435703cfcea586758e80668ccde92b7bab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 15 Jan 2024 15:50:41 +0800 Subject: [PATCH 121/204] =?UTF-8?q?Long=20->=20String=20=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8C=96=E7=9A=84=E6=96=B0=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 80 +++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 54 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 5a02de2..08b0c0a 100644 --- a/README.md +++ b/README.md @@ -111,29 +111,30 @@ https\://services.gradle.org/distributions/gradle-7.4-bin.zip ![img_1.png](asset/img/gradle.png) - 技术 | 说明 | 官网 -----------------------|--------------------|-------------------------------------------------------------------------------------------------------------- - Spring Boot | 容器+MVC框架 | [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot) - Gradle | 项目构建工具 | [https://gradle.com/](https://gradle.com/) - Spring Security | 认证和授权框架 | [https://spring.io/projects/spring-security](https://spring.io/projects/spring-security) - MyBatis | ORM框架 | [http://www.mybatis.org/mybatis-3/zh/index.html](http://www.mybatis.org/mybatis-3/zh/index.html) - MyBatisPlus | ORM框架补充 | [https://mybatis.plus/](https://mybatis.plus/) - MyBatisGenerator | 数据层代码生成 | [http://www.mybatis.org/generator/index.html](http://www.mybatis.org/generator/index.html) - Swagger-UI | 文档生产工具 | [https://github.com/swagger-api/swagger-ui](https://github.com/swagger-api/swagger-ui) - Hibernator-Validator | 验证框架 | [http://hibernate.org/validator/](http://hibernate.org/validator/) - Elasticsearch | 搜索引擎 | [https://github.com/elastic/elasticsearch](https://github.com/elastic/elasticsearch) - RabbitMq | 消息队列 | [https://www.rabbitmq.com/](https://www.rabbitmq.com/) - Redis | 分布式缓存 | [https://redis.io/](https://redis.io/) - redisson | 分布式锁,布隆过滤器 | https://github.com/redisson/redisson - MongoDb | NoSql数据库 | [https://www.mongodb.com/](https://www.mongodb.com/) - Docker | 应用容器引擎 | [https://www.docker.com/](https://www.docker.com/) - Hikari | SpringBoot默认数据库连接池 | [https://github.com/brettwooldridge/HikariCP](https://github.com/brettwooldridge/HikariCP) - Druid | 数据库连接池 | [https://github.com/alibaba/druid](https://github.com/alibaba/druid) - JWT | JWT登录支持 | [https://github.com/jwtk/jjwt](https://github.com/jwtk/jjwt) - LogStash | 日志收集 | [https://github.com/logstash/logstash-logback-encoder](https://github.com/logstash/logstash-logback-encoder) - Lombok | 简化对象封装工具 | [https://github.com/rzwitserloot/lombok](https://github.com/rzwitserloot/lombok) - loc | 代码行数统计 | https://github.com/cgag/loc - ko-time | 轻量级的springboot项目性能分析工具,通过追踪方法调用链路以及对应的运行时长快速定位性能瓶颈 | https://gitee.com/huoyo/ko-time + 技术 | 说明 | 官网 +----------------------|----------------------------------------------------|-------------------------------------------------------------------------------------------------------------- + Spring Boot | 容器+MVC框架 | [https://spring.io/projects/spring-boot](https://spring.io/projects/spring-boot) + Gradle | 项目构建工具 | [https://gradle.com/](https://gradle.com/) + Spring Security | 认证和授权框架 | [https://spring.io/projects/spring-security](https://spring.io/projects/spring-security) + MyBatis | ORM框架 | [http://www.mybatis.org/mybatis-3/zh/index.html](http://www.mybatis.org/mybatis-3/zh/index.html) + MyBatisPlus | ORM框架补充 | [https://mybatis.plus/](https://mybatis.plus/) + MyBatisGenerator | 数据层代码生成 | [http://www.mybatis.org/generator/index.html](http://www.mybatis.org/generator/index.html) + Swagger-UI | 文档生产工具 | [https://github.com/swagger-api/swagger-ui](https://github.com/swagger-api/swagger-ui) + Hibernator-Validator | 验证框架 | [http://hibernate.org/validator/](http://hibernate.org/validator/) + Elasticsearch | 搜索引擎 | [https://github.com/elastic/elasticsearch](https://github.com/elastic/elasticsearch) + RabbitMq | 消息队列 | [https://www.rabbitmq.com/](https://www.rabbitmq.com/) + Redis | 分布式缓存 | [https://redis.io/](https://redis.io/) + redisson | 分布式锁,布隆过滤器 | https://github.com/redisson/redisson + MongoDb | NoSql数据库 | [https://www.mongodb.com/](https://www.mongodb.com/) + Docker | 应用容器引擎 | [https://www.docker.com/](https://www.docker.com/) + Hikari | SpringBoot默认数据库连接池 | [https://github.com/brettwooldridge/HikariCP](https://github.com/brettwooldridge/HikariCP) + Druid | 数据库连接池 | [https://github.com/alibaba/druid](https://github.com/alibaba/druid) + JWT | JWT登录支持 | [https://github.com/jwtk/jjwt](https://github.com/jwtk/jjwt) + LogStash | 日志收集 | [https://github.com/logstash/logstash-logback-encoder](https://github.com/logstash/logstash-logback-encoder) + Lombok | 简化对象封装工具 | [https://github.com/rzwitserloot/lombok](https://github.com/rzwitserloot/lombok) + loc | 代码行数统计 | https://github.com/cgag/loc + ko-time | 轻量级的springboot项目性能分析工具,通过追踪方法调用链路以及对应的运行时长快速定位性能瓶颈 | https://gitee.com/huoyo/ko-time + #### SpringBoot支持 https://spring.io/projects/spring-boot#support @@ -182,13 +183,40 @@ google出品的一个插件,可以直接将SpringBoot构建推送到Docker仓 ## 统一Long类型序列化 +### 方案1 + +[BaseLongSerializer.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fserializer%2FBaseLongSerializer.java) + +### 方案2 + +https://mp.weixin.qq.com/s/qhG9T0VdW4VkVy2VJJmftg + +```java +import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; + +@Configuration +public class JacksonConfiguration { + + @Bean + public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { + return builder -> { + // 把 Long 类型序列化为 String + builder.serializerByType(Long.class, ToStringSerializer.instance); + }; + } +} +``` + 前端JS内置的number类型是基于32位整数,Number类型的最大安全整数为9007199254740991,当Java Long型的值大小超过JS Number的最大安全整数时,超出此范围的整数值可能会被破坏,丢失精度。 解决办法就是后端将超过精度的Long和long类型转成String给前端展示即可。 -> [JSON类库Jackson优雅序列化Java类 -](https://docs.qq.com/doc/DSFpuQkRrdk9xUlF6) +> [JSON类库Jackson优雅序列化Java类](https://docs.qq.com/doc/DSFpuQkRrdk9xUlF6) ## 统一序列化枚举 @@ -251,7 +279,7 @@ https://blog.csdn.net/bandancer/article/details/84926383 [关于springboot中添加Filter的方法](https://www.jianshu.com/p/3d421fbce734) -### +### ``` WARN at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive (PoolBase.java:184) - HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@63ec6a5a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -- Gitee From 5de3495e869559b2868b7da24586894746974fc7 Mon Sep 17 00:00:00 2001 From: aohanhongzhi <37319319+aohanhongzhi@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:25:02 +0800 Subject: [PATCH 122/204] Update gradle-publish.yml set jdk21 --- .github/workflows/gradle-publish.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle-publish.yml b/.github/workflows/gradle-publish.yml index 3e30133..7d91b27 100644 --- a/.github/workflows/gradle-publish.yml +++ b/.github/workflows/gradle-publish.yml @@ -21,10 +21,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 11 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '21' distribution: 'temurin' server-id: github # Value of the distributionManagement/repository/id field of the pom.xml settings-path: ${{ github.workspace }} # location for the settings.xml file -- Gitee From b62584a5760fbc10581e0be28093eba86c15c42c Mon Sep 17 00:00:00 2001 From: aohanhongzhi <37319319+aohanhongzhi@users.noreply.github.com> Date: Tue, 16 Jan 2024 14:26:11 +0800 Subject: [PATCH 123/204] Update gradle.yml jdk21 --- .github/workflows/gradle.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 2c7d933..efd74be 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -23,10 +23,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 11 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: '11' + java-version: '21' distribution: 'temurin' - name: Build with Gradle uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0 -- Gitee From 8c188513ef5863b9a9e7720f5b690d49b5348a02 Mon Sep 17 00:00:00 2001 From: aohanhongzhi <37319319+aohanhongzhi@users.noreply.github.com> Date: Wed, 17 Jan 2024 20:30:36 +0800 Subject: [PATCH 124/204] Update gradle.yml -x test --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index efd74be..2efafc6 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -31,4 +31,4 @@ jobs: - name: Build with Gradle uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0 with: - arguments: build + arguments: build -x test -- Gitee From 5b402fca60ccf92bd38d25a5cf3ec5efb9d9baf7 Mon Sep 17 00:00:00 2001 From: aohanhongzhi <37319319+aohanhongzhi@users.noreply.github.com> Date: Wed, 17 Jan 2024 20:31:00 +0800 Subject: [PATCH 125/204] Update gradle-publish.yml -x test --- .github/workflows/gradle-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle-publish.yml b/.github/workflows/gradle-publish.yml index 7d91b27..eecf216 100644 --- a/.github/workflows/gradle-publish.yml +++ b/.github/workflows/gradle-publish.yml @@ -32,7 +32,7 @@ jobs: - name: Build with Gradle uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0 with: - arguments: build + arguments: build -x test # The USERNAME and TOKEN need to correspond to the credentials environment variables used in # the publishing section of your build.gradle -- Gitee From d855389dfeaf41c1931cbf39afa811b15ed71f70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 19 Jan 2024 14:29:03 +0800 Subject: [PATCH 126/204] add highlight for file log --- app/src/main/resources/logback-spring.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/resources/logback-spring.xml b/app/src/main/resources/logback-spring.xml index eb39751..3cd19cb 100644 --- a/app/src/main/resources/logback-spring.xml +++ b/app/src/main/resources/logback-spring.xml @@ -49,7 +49,7 @@ 200MB - %date %level [%thread] %logger{36} [%file : %line] %msg%n + %date %highlight(%-5level) [%thread] %yellow(at %class.%method) \(%file:%line\) - %msg%n -- Gitee From 4016b8673517de0587e84964562679d4119ac070 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 20 Jan 2024 13:24:34 +0800 Subject: [PATCH 127/204] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=AF=BB=E5=8F=96=E6=95=8F=E6=84=9F=E9=85=8D=E7=BD=AE=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- .../main/resources/META-INF/spring.factories | 1 + app/src/main/resources/application-beta.yml | 2 +- app/src/main/resources/application-test.yml | 16 ++---- .../RemoteEnvironmentPostProcessor.java | 49 ++++++++++++++----- 5 files changed, 44 insertions(+), 27 deletions(-) create mode 100644 app/src/main/resources/META-INF/spring.factories diff --git a/README.md b/README.md index 08b0c0a..583fedb 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ Eric-Dream 参数全局trim() | [StringTrimDeserializer](common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java) | 避免异常数据 Long类型超长转String | | 解决前端无法正确显示超长String 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决"null"等问题 + 敏感信息从程序外配置文件读取 | [RemoteEnvironmentPostProcessor.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FRemoteEnvironmentPostProcessor.java) | 从程序外的配置文件读取数据库的账号密码信息 具体框架如下表: @@ -279,7 +280,7 @@ https://blog.csdn.net/bandancer/article/details/84926383 [关于springboot中添加Filter的方法](https://www.jianshu.com/p/3d421fbce734) -### +### ``` WARN at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive (PoolBase.java:184) - HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@63ec6a5a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. diff --git a/app/src/main/resources/META-INF/spring.factories b/app/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..ccd6393 --- /dev/null +++ b/app/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +org.springframework.boot.env.EnvironmentPostProcessor=hxy.dream.common.configuration.RemoteEnvironmentPostProcessor \ No newline at end of file diff --git a/app/src/main/resources/application-beta.yml b/app/src/main/resources/application-beta.yml index 7db1d0d..ea8f26f 100755 --- a/app/src/main/resources/application-beta.yml +++ b/app/src/main/resources/application-beta.yml @@ -3,7 +3,7 @@ spring: datasource: url: jdbc:mysql://mysql.cupb.top:3306/eric?useUnicode=true&serverTimezone=GMT%2b8&characterEncoding=UTF-8 username: eric - password: dream,1234.. + password: # 密码参考 hxy.dream.common.configuration.RemoteEnvironmentPostProcessor 获取逻辑 driver-class-name: com.mysql.cj.jdbc.Driver hikari: max-lifetime: 120000 # 池中连接关闭后的最长生命周期 20分钟 diff --git a/app/src/main/resources/application-test.yml b/app/src/main/resources/application-test.yml index f25db0c..55bceb7 100755 --- a/app/src/main/resources/application-test.yml +++ b/app/src/main/resources/application-test.yml @@ -2,9 +2,9 @@ spring: datasource: url: jdbc:p6spy:mysql://139.217.230.42:3306/test?useUnicode=true&serverTimezone=GMT%2b8&characterEncoding=UTF-8 - username: test - password: Newp0ss,2024! -# driver-class-name: com.mysql.cj.jdbc.Driver + username: # 用户名参考 hxy.dream.common.configuration.RemoteEnvironmentPostProcessor 获取逻辑 + password: # 密码参考 hxy.dream.common.configuration.RemoteEnvironmentPostProcessor 获取逻辑 + # driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.p6spy.engine.spy.P6SpyDriver hikari: max-lifetime: 120000 # 池中连接关闭后的最长生命周期 20分钟 @@ -52,16 +52,6 @@ logging: mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl - -hxy: - print: - file: /home/ubuntu/eric/print/file - pay-status: true #支付测试 - single-price: 20 - double-price: 25 - shop: cupb - http: 8080 - https: 8443 #server: # ssl: # key-store: classpath:cupbtop.jks diff --git a/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java b/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java index 24947bc..fed57bc 100644 --- a/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java +++ b/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java @@ -1,41 +1,66 @@ package hxy.dream.common.configuration; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; -import org.springframework.context.annotation.Profile; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.PropertiesPropertySource; -import org.springframework.stereotype.Component; +import java.io.File; +import java.io.IOException; import java.util.Properties; /** - * @author Raina - * @description 远程存储环境变量修改本地 + * @description bean初始化之前,Spring环境变量修改 https://blog.csdn.net/weixin_43827985/article/details/114368232 + * 1. 可以读取Azue KeyValue + * 2. 可以读取本机的配置文件 + *

+ * 这个类生效靠:app/src/main/resources/META-INF/spring.factories * @date 2022/2/25 */ -@Component -@Profile(value = {"prod", "beta"}) +//@Profile(value = {"prod", "beta"}) // 貌似这个没啥用,其他环境变量的时候也跑了程序 public class RemoteEnvironmentPostProcessor implements EnvironmentPostProcessor { + private static final Logger log = LoggerFactory.getLogger(RemoteEnvironmentPostProcessor.class); + @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { String currentProfile = environment.getProperty("spring.profiles.active"); if (currentProfile == null || currentProfile.equalsIgnoreCase("dev")) { - log.debug("本地调试,直接忽略"); - return; + log.warn("本地调试,直接忽略读取本地配置文件信息"); } else { - String url = environment.getProperty("azure.keyvault.url"); final Properties properties = new Properties(); + + // 读取配置文件,从配置文件中加载这个变量。 + String database = System.getProperty("user.home") + "/.config/eric-config/database.json"; + ObjectMapper objectMapper = new ObjectMapper(); + try { + JsonNode jsonObject = objectMapper.readTree(new File(database)); + String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); + String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); + String password = jsonObject.get("spring.datasource.password").textValue(); + properties.put("spring.datasource.url", databaseUrl); + properties.put("spring.datasource.username", databaseUsername); + properties.put("spring.datasource.password", password); + } catch (JsonProcessingException e) { + log.error("{}", e.getMessage(), e); + } catch (IOException e) { + log.error("{}", e.getMessage(), e); + } + + String url = environment.getProperty("azure.keyvault.url"); if (url == null) { - // 从远程vault这种管理工具或者redis里面获取配置信息,然后再更新到本地的配置中 + // 从远程vault这种管理工具或者redis里面获取配置信息,然后再更新到本地的配置中 https://learn.microsoft.com/zh-cn/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-key-vault properties.put("password", "vault获取的值"); - PropertiesPropertySource propertySource = new PropertiesPropertySource("prod", properties); - environment.getPropertySources().addFirst(propertySource); } + PropertiesPropertySource propertySource = new PropertiesPropertySource(currentProfile, properties); +// PropertiesPropertySource propertySource = new PropertiesPropertySource("prod", properties); // 只修改指定环境变量的配置信息 + environment.getPropertySources().addFirst(propertySource); } } } -- Gitee From 9b9a145df2f9b151047dd50b32d8af6a721c5027 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 20 Jan 2024 13:29:05 +0800 Subject: [PATCH 128/204] bump springboot from 3.2.1 to 3.2.2 --- .../test/resources/api/http-client.env.json | 2 +- app/src/test/resources/api/local.http | 22 +++++++++---------- build.gradle | 8 +++---- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/src/test/resources/api/http-client.env.json b/app/src/test/resources/api/http-client.env.json index 67d83c2..f81a90c 100644 --- a/app/src/test/resources/api/http-client.env.json +++ b/app/src/test/resources/api/http-client.env.json @@ -1,5 +1,5 @@ { "dev": { - "host": "http://localhost:8082" + "host": "http://localhost:8080" } } \ No newline at end of file diff --git a/app/src/test/resources/api/local.http b/app/src/test/resources/api/local.http index 8fefd1c..d0f4463 100644 --- a/app/src/test/resources/api/local.http +++ b/app/src/test/resources/api/local.http @@ -1,4 +1,4 @@ -GET http://localhost:8080/user/get/1 +GET {{host}}/user/get/1 ### 添加 POST {{host}}/user/add/body @@ -27,7 +27,7 @@ Accept: application/json } ### 删除 -DELETE http://localhost:8080/user/delete?id=2 +DELETE {{host}}/user/delete?id=2 ### 添加 POST {{host}}/user/add2?gender=0&name=张三&age=22 @@ -36,23 +36,23 @@ Accept: application/json ### 列表 -GET http://localhost:8082/user/list +GET {{host}}/user/list ### 事务测试传播机制 -GET http://localhost:8080/transaction/propagation +GET {{host}}/transaction/propagation ### 事务隔离级别测试 -GET http://localhost:8080/transaction/isolation +GET {{host}}/transaction/isolation ### 事务测试 -GET http://localhost:8080/ +GET {{host}}/ ### 返回json测试 -GET http://localhost:8080/exception +GET {{host}}/exception ### -GET http://localhost:8080/exception-output +GET {{host}}/exception-output ### servlet @@ -75,12 +75,12 @@ GET {{host}}/threadlocal/wrong?userId=122 GET localhost:8080/concurrentHashMap/wrong ### Long精度测试 -GET http://localhost:8080/long +GET {{host}}/long ### 异步测试 -GET http://localhost:8080/async/test +GET {{host}}/async/test ### -GET http://localhost:8080/async/concurrency \ No newline at end of file +GET {{host}}/async/concurrency \ No newline at end of file diff --git a/build.gradle b/build.gradle index 334ebf2..5d48739 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.2.1' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.2.2' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() @@ -33,9 +33,9 @@ buildscript { plugins { - id 'io.spring.dependency-management' version '1.1.4' - // https://github.com/spring-gradle-plugins/dependency-management-plugin id 'java-library' + // https://github.com/spring-gradle-plugins/dependency-management-plugin + id 'io.spring.dependency-management' version '1.1.4' id 'idea' id "com.google.cloud.tools.jib" version "2.0.0" } @@ -145,7 +145,7 @@ subprojects { implementation 'com.zaxxer:HikariCP:5.1.0' implementation 'p6spy:p6spy:3.9.1' - implementation 'commons-io:commons-io:2.11.0' + implementation 'commons-io:commons-io:2.15.0' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.15.2' // Java 8 Datatypes -- Gitee From b969e195cc3b8373470d969f2432fa4b6cf9723f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 20 Jan 2024 13:53:05 +0800 Subject: [PATCH 129/204] =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E9=9C=80=E8=A6=81?= =?UTF-8?q?=E7=89=B9=E5=AE=9A=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RemoteEnvironmentPostProcessor.java | 61 +++++++++++-------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java b/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java index fed57bc..961c335 100644 --- a/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java +++ b/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java @@ -12,6 +12,7 @@ import org.springframework.core.env.PropertiesPropertySource; import java.io.File; import java.io.IOException; +import java.util.Map; import java.util.Properties; /** @@ -31,36 +32,44 @@ public class RemoteEnvironmentPostProcessor implements EnvironmentPostProcessor @Override public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { String currentProfile = environment.getProperty("spring.profiles.active"); - if (currentProfile == null || currentProfile.equalsIgnoreCase("dev")) { - log.warn("本地调试,直接忽略读取本地配置文件信息"); + if (currentProfile == null) { + // 这里需要带特定环境变量的配置文件,即没有 dev,beta,prod都是可以的 + Map systemProperties = environment.getSystemProperties(); + systemProperties.put("key", "value"); } else { - final Properties properties = new Properties(); + if (currentProfile.equalsIgnoreCase("dev")) { + log.warn("本地调试,直接忽略读取本地配置文件信息"); + } else { + final Properties properties = new Properties(); - // 读取配置文件,从配置文件中加载这个变量。 - String database = System.getProperty("user.home") + "/.config/eric-config/database.json"; - ObjectMapper objectMapper = new ObjectMapper(); - try { - JsonNode jsonObject = objectMapper.readTree(new File(database)); - String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); - String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); - String password = jsonObject.get("spring.datasource.password").textValue(); - properties.put("spring.datasource.url", databaseUrl); - properties.put("spring.datasource.username", databaseUsername); - properties.put("spring.datasource.password", password); - } catch (JsonProcessingException e) { - log.error("{}", e.getMessage(), e); - } catch (IOException e) { - log.error("{}", e.getMessage(), e); - } + // 读取配置文件,从配置文件中加载这个变量。 + String database = System.getProperty("user.home") + "/.config/eric-config/database.json"; + ObjectMapper objectMapper = new ObjectMapper(); + try { + JsonNode jsonObject = objectMapper.readTree(new File(database)); + String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); + String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); + String password = jsonObject.get("spring.datasource.password").textValue(); + properties.put("spring.datasource.url", databaseUrl); + properties.put("spring.datasource.username", databaseUsername); + properties.put("spring.datasource.password", password); + } catch (JsonProcessingException e) { + log.error("{}", e.getMessage(), e); + } catch (IOException e) { + log.error("{}", e.getMessage(), e); + } - String url = environment.getProperty("azure.keyvault.url"); - if (url == null) { - // 从远程vault这种管理工具或者redis里面获取配置信息,然后再更新到本地的配置中 https://learn.microsoft.com/zh-cn/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-key-vault - properties.put("password", "vault获取的值"); - } - PropertiesPropertySource propertySource = new PropertiesPropertySource(currentProfile, properties); + String url = environment.getProperty("azure.keyvault.url"); + if (url == null) { + // 从远程vault这种管理工具或者redis里面获取配置信息,然后再更新到本地的配置中 https://learn.microsoft.com/zh-cn/azure/developer/java/spring-framework/configure-spring-boot-starter-java-app-with-azure-key-vault + properties.put("password", "vault获取的值"); + } + + PropertiesPropertySource propertySource = new PropertiesPropertySource(currentProfile, properties); // PropertiesPropertySource propertySource = new PropertiesPropertySource("prod", properties); // 只修改指定环境变量的配置信息 - environment.getPropertySources().addFirst(propertySource); + environment.getPropertySources().addFirst(propertySource); + + } } } } -- Gitee From 7db157f1e35f824358b5e61eb14567495c8017ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 20 Jan 2024 14:00:54 +0800 Subject: [PATCH 130/204] =?UTF-8?q?=E6=9E=81=E6=B5=B7=E7=9A=84=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 32 +++++----- .../configuration/DataSourceConfigLoader.java | 62 +++++++++++++++++++ 2 files changed, 78 insertions(+), 16 deletions(-) create mode 100644 common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java diff --git a/README.md b/README.md index 583fedb..1de35bf 100644 --- a/README.md +++ b/README.md @@ -8,21 +8,21 @@ Eric-Dream ## 主要实现功能如下 - 功能 | 实现 | 用途 ------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------|------------------------------------------------- - IDEA开发热加载实现 | JBR + HotswapAgent | https://github.com/HotswapProjects/HotswapAgent - [jackson序列化](SERIALIZE.md) | 自定义序列化器 | 解决参数枚举的序列化问题 - logback钉钉通知 | 自定义Appender | Error消息及时通知 - logback邮件通知 | 默认支持 | Error异常及时通知 - 全局异常捕获 | 默认支持 | 捕获异常 - 数据库字段加解密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 给部分数据库字段加解密 - 执行初始化SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | - [MybatisPlus的SQL脚本自动维护](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) | https://baomidou.com/pages/1812u1/ | 自动建表 - SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | - 参数全局trim() | [StringTrimDeserializer](common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java) | 避免异常数据 - Long类型超长转String | | 解决前端无法正确显示超长String - 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决"null"等问题 - 敏感信息从程序外配置文件读取 | [RemoteEnvironmentPostProcessor.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FRemoteEnvironmentPostProcessor.java) | 从程序外的配置文件读取数据库的账号密码信息 + 功能 | 实现 | 用途 +-----------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------- + IDEA开发热加载实现 | JBR + HotswapAgent | https://github.com/HotswapProjects/HotswapAgent + [jackson序列化](SERIALIZE.md) | 自定义序列化器 | 解决参数枚举的序列化问题 + logback钉钉通知 | 自定义Appender | Error消息及时通知 + logback邮件通知 | 默认支持 | Error异常及时通知 + 全局异常捕获 | 默认支持 | 捕获异常 + 数据库字段加解密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 给部分数据库字段加解密 + 执行初始化SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | + [MybatisPlus的SQL脚本自动维护](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) | https://baomidou.com/pages/1812u1/ | 自动建表 + SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | + 参数全局trim() | [StringTrimDeserializer](common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java) | 避免异常数据 + Long类型超长转String | | 解决前端无法正确显示超长String + 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决"null"等问题 + 敏感信息从程序外配置文件读取 | [RemoteEnvironmentPostProcessor.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FRemoteEnvironmentPostProcessor.java) 极海的方案 [DataSourceConfigLoader.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FDataSourceConfigLoader.java) | 从程序外的配置文件读取数据库的账号密码信息 具体框架如下表: @@ -280,7 +280,7 @@ https://blog.csdn.net/bandancer/article/details/84926383 [关于springboot中添加Filter的方法](https://www.jianshu.com/p/3d421fbce734) -### +### ``` WARN at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive (PoolBase.java:184) - HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@63ec6a5a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. diff --git a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java new file mode 100644 index 0000000..4a461ee --- /dev/null +++ b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java @@ -0,0 +1,62 @@ +package hxy.dream.common.configuration; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.EnvironmentAware; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import java.io.File; +import java.io.IOException; +import java.util.Map; + +/** + * B站Up主 【极海channel】 的方案 https://b23.tv/OTa283B + * 这个不需要 spring.factories 去配置生效 + */ +@Component +public class DataSourceConfigLoader implements BeanPostProcessor, EnvironmentAware { + + private static final Logger log = LoggerFactory.getLogger(DataSourceConfigLoader.class); + + private ConfigurableEnvironment environment; + + @Override + public void setEnvironment(Environment environment) { + this.environment = (ConfigurableEnvironment) environment; + } + + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + + if (bean instanceof MybatisAutoConfiguration) { //在mybatis初始化前搞定配置信息 + Map systemProperties = environment.getSystemProperties(); + // 读取配置文件,从配置文件中加载这个变量。 + String database = System.getProperty("user.home") + "/.config/eric-config/database.json"; + ObjectMapper objectMapper = new ObjectMapper(); + try { + JsonNode jsonObject = objectMapper.readTree(new File(database)); + String databaseUrl = jsonObject.get("spring.r2dbc.url").textValue(); + String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); + String password = jsonObject.get("spring.datasource.password").textValue(); + systemProperties.put("spring.r2dbc.url", databaseUrl); + systemProperties.put("spring.r2dbc.username", databaseUsername); + systemProperties.put("spring.r2dbc.password", password); + } catch (JsonProcessingException e) { + log.error("{}", e.getMessage(), e); + } catch (IOException e) { + log.error("{}", e.getMessage(), e); + } + } + + return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName); + } +} -- Gitee From a74b352091dd28ef785eaf2381d235c93307b83f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 21 Jan 2024 14:24:02 +0800 Subject: [PATCH 131/204] center and blod --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 1de35bf..d52c3e3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -Eric-Dream +

Eric-Dream

=== 本工程承担日常实验的作用,任何先行的尝试都在这里实践与落地。成熟的方案设计会在 [base-server](https://gitee.com/aohanhongzhi/springboot-base) 里面落地到生产。 -- Gitee From 0aa120102767293897bb2f501a623304cc18a859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 21 Jan 2024 14:25:27 +0800 Subject: [PATCH 132/204] =?UTF-8?q?=E5=AD=97=E7=AC=A6=E4=B8=B2=E2=80=9Cnul?= =?UTF-8?q?l=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d52c3e3..ecba5a4 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | 参数全局trim() | [StringTrimDeserializer](common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java) | 避免异常数据 Long类型超长转String | | 解决前端无法正确显示超长String - 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决"null"等问题 + 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决字符串"null"等问题 敏感信息从程序外配置文件读取 | [RemoteEnvironmentPostProcessor.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FRemoteEnvironmentPostProcessor.java) 极海的方案 [DataSourceConfigLoader.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FDataSourceConfigLoader.java) | 从程序外的配置文件读取数据库的账号密码信息 具体框架如下表: -- Gitee From 542a7553a8d5cd067c65b58faef29f469082dc51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 28 Jan 2024 18:48:01 +0800 Subject: [PATCH 133/204] https://gitee.com/eric-tutorial/SpringCloud-multiple-gradle/issues/I8ZGOM --- build.gradle | 9 +++++++++ settings.gradle | 1 + 2 files changed, 10 insertions(+) diff --git a/build.gradle b/build.gradle index 5d48739..3763356 100644 --- a/build.gradle +++ b/build.gradle @@ -38,6 +38,8 @@ plugins { id 'io.spring.dependency-management' version '1.1.4' id 'idea' id "com.google.cloud.tools.jib" version "2.0.0" +// https://github.com/graalvm/native-build-tools + id 'org.graalvm.buildtools.native' version '0.9.28' } @@ -163,6 +165,13 @@ subprojects { } } +// +//graalvmNative { +// binaries.all { +// resources.autodetect() +// } +// toolchainDetection = false +//} //下面是google构建docker镜像插件的配置 jib { diff --git a/settings.gradle b/settings.gradle index 049f645..d27159b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,6 +2,7 @@ pluginManagement { repositories { maven { name "Alibaba spring-plugin"; url "https://maven.aliyun.com/repository/spring-plugin" } maven { name "Alibaba gradle-plugin"; url "https://maven.aliyun.com/repository/gradle-plugin" } + mavenCentral() gradlePluginPortal() } } -- Gitee From 20b536e67e814905aa8b6554995aad54ea57471d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 29 Jan 2024 12:51:43 +0800 Subject: [PATCH 134/204] =?UTF-8?q?=E3=80=90=E8=85=BE=E8=AE=AF=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E3=80=91=E7=B3=BB=E7=BB=9F=E9=85=8D=E7=BD=AE=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=20https://docs.qq.com/doc/DSFdLamxuUXNWRVZJ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../common/configuration/RemoteEnvironmentPostProcessor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 3763356..9008e40 100644 --- a/build.gradle +++ b/build.gradle @@ -39,7 +39,7 @@ plugins { id 'idea' id "com.google.cloud.tools.jib" version "2.0.0" // https://github.com/graalvm/native-build-tools - id 'org.graalvm.buildtools.native' version '0.9.28' +// id 'org.graalvm.buildtools.native' version '0.9.28' } diff --git a/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java b/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java index 961c335..14559f6 100644 --- a/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java +++ b/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java @@ -42,7 +42,7 @@ public class RemoteEnvironmentPostProcessor implements EnvironmentPostProcessor } else { final Properties properties = new Properties(); - // 读取配置文件,从配置文件中加载这个变量。 + // 读取配置文件,从配置文件中加载这个变量。 【腾讯文档】系统配置信息 https://docs.qq.com/doc/DSFdLamxuUXNWRVZJ String database = System.getProperty("user.home") + "/.config/eric-config/database.json"; ObjectMapper objectMapper = new ObjectMapper(); try { -- Gitee From 9721f9cd6dcbd9d90d5e2411eb3323c3120071af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 23 Feb 2024 10:50:47 +0800 Subject: [PATCH 135/204] bump springboot from 3.2.2 to 3.2.3 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9008e40..c1991b5 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.2.2' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.2.3' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() -- Gitee From 15974ce6776e6e2af29b1eff26bdba5727492498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 17 Mar 2024 18:50:50 +0800 Subject: [PATCH 136/204] =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A@ActiveProfiles("test")?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/resources/application.yml | 2 +- app/src/test/java/hxy/dream/BaseTest.java | 8 +++ .../common/util/UnitTestEnvironmentTest.java | 19 ++++++ .../dream/common/util/EnvironmentUtils.java | 59 +++++++++++++++++++ 4 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 app/src/test/java/hxy/dream/common/util/UnitTestEnvironmentTest.java create mode 100644 common/src/main/java/hxy/dream/common/util/EnvironmentUtils.java diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index d902c34..2e74d61 100755 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -12,7 +12,7 @@ spring: multipart: enabled: false profiles: - active: test #环境隔离 + active: beta #环境隔离 mail: username: aohanhongzhi@qq.com password: vtrxapjtpcivdbcb diff --git a/app/src/test/java/hxy/dream/BaseTest.java b/app/src/test/java/hxy/dream/BaseTest.java index 7c3b552..7a2c7e4 100644 --- a/app/src/test/java/hxy/dream/BaseTest.java +++ b/app/src/test/java/hxy/dream/BaseTest.java @@ -1,8 +1,16 @@ package hxy.dream; import hxy.dream.app.Application; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +/** + * 使用 @ActiveProfiles 注解,可以覆盖掉yaml文件的指定配置环境,方便单元测试指定环境。又不影响线上部署 + */ +@ActiveProfiles("test") @SpringBootTest(classes = Application.class) public abstract class BaseTest { + public static final Logger log = LoggerFactory.getLogger(BaseTest.class); } diff --git a/app/src/test/java/hxy/dream/common/util/UnitTestEnvironmentTest.java b/app/src/test/java/hxy/dream/common/util/UnitTestEnvironmentTest.java new file mode 100644 index 0000000..bce08d4 --- /dev/null +++ b/app/src/test/java/hxy/dream/common/util/UnitTestEnvironmentTest.java @@ -0,0 +1,19 @@ +package hxy.dream.common.util; + +import hxy.dream.BaseTest; +import org.junit.jupiter.api.Test; + +/** + * @author eric + * @description + * @date 2024/3/17 + */ +public class UnitTestEnvironmentTest extends BaseTest { + + @Test + public void testEnvironmentUtils() { + String activeProfile = EnvironmentUtils.getActiveProfile(); + log.info("{}", activeProfile); + } + +} diff --git a/common/src/main/java/hxy/dream/common/util/EnvironmentUtils.java b/common/src/main/java/hxy/dream/common/util/EnvironmentUtils.java new file mode 100644 index 0000000..fb53889 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/util/EnvironmentUtils.java @@ -0,0 +1,59 @@ +package hxy.dream.common.util; + +import org.springframework.context.EnvironmentAware; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * @author eric + */ +@Component +public class EnvironmentUtils implements EnvironmentAware { + + + public static final String PROD = "prod"; + public static final String DEV = "dev"; + public static final String BETA = "beta"; + public static final String UAT = "uat"; + + + private static Environment environment; + + @Override + public void setEnvironment(Environment environment) { + this.environment = environment; + } + + /** + * 或者直接@Value("${spring.profiles.active}")即可 + * + * @return 当前选择的环境变量 + */ + public static String getActiveProfile() { + if (environment != null) { + if (environment.getActiveProfiles().length > 0) { + return environment.getActiveProfiles()[0]; + } else { + return environment.getDefaultProfiles()[0]; + } + } else { + return null; + } + } + + public static boolean isProdOrBeta() { + String activeProfile = getActiveProfile(); + if (PROD.equals(activeProfile) || BETA.equals(activeProfile)) { + return true; + } + return false; + } + + public static boolean isProd() { + String activeProfile = getActiveProfile(); + if (PROD.equals(activeProfile)) { + return true; + } + return false; + } +} -- Gitee From 5850578031d2a3cb2da8bf8ece477b593f87a99c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 17 Mar 2024 19:11:08 +0800 Subject: [PATCH 137/204] =?UTF-8?q?=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=8A=A0=E4=B8=8A@ActiveProfiles("test")?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ecba5a4..6c14e25 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,9 @@ SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | 参数全局trim() | [StringTrimDeserializer](common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java) | 避免异常数据 Long类型超长转String | | 解决前端无法正确显示超长String - 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决字符串"null"等问题 + 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决字符串"null"等问题 敏感信息从程序外配置文件读取 | [RemoteEnvironmentPostProcessor.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FRemoteEnvironmentPostProcessor.java) 极海的方案 [DataSourceConfigLoader.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FDataSourceConfigLoader.java) | 从程序外的配置文件读取数据库的账号密码信息 + 单元测试默认配置环境 | @ActiveProfiles("test") | 解决每次修改yaml文件的烦恼 | 具体框架如下表: @@ -280,7 +281,7 @@ https://blog.csdn.net/bandancer/article/details/84926383 [关于springboot中添加Filter的方法](https://www.jianshu.com/p/3d421fbce734) -### +### ``` WARN at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive (PoolBase.java:184) - HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@63ec6a5a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -- Gitee From 1c6f8ed73af9b83c4f19f4cd4c798f43af6c8692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 17 Mar 2024 19:12:24 +0800 Subject: [PATCH 138/204] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/ThreadPoolExecutorTool.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 common/src/main/java/hxy/dream/common/util/ThreadPoolExecutorTool.java diff --git a/common/src/main/java/hxy/dream/common/util/ThreadPoolExecutorTool.java b/common/src/main/java/hxy/dream/common/util/ThreadPoolExecutorTool.java new file mode 100644 index 0000000..4998c15 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/util/ThreadPoolExecutorTool.java @@ -0,0 +1,22 @@ +package hxy.dream.common.util; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * @author eric + * @description + * @date 2021/12/23 + */ +public class ThreadPoolExecutorTool { + /** + * 阿里巴巴建议自己手动新建线程池,一定要指定最大线程数。 + * 这里的线程池maximumPoolSize依据CPU核心数来确定核心线程数有多少个。一般是核心数+1 + */ + public static ExecutorService POOL = new ThreadPoolExecutor(8, 16, + 15L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(2048), Executors. + defaultThreadFactory(), new ThreadPoolExecutor.CallerRunsPolicy()); +} -- Gitee From 0df2d1e15ba46ae4801cb24abf96af3ffae5e7c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 17 Mar 2024 19:21:28 +0800 Subject: [PATCH 139/204] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E6=B1=A0ThreadPoolExecutorTool?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ThreadPool.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ThreadPool.md b/ThreadPool.md index 895a0ea..f5a98a3 100644 --- a/ThreadPool.md +++ b/ThreadPool.md @@ -25,6 +25,8 @@ } ``` +直接调用 [ThreadPoolExecutorTool.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Futil%2FThreadPoolExecutorTool.java) + ## SpringBoot的自带线程池 ![](asset/img/SpringBoot上下文调试.png) -- Gitee From 1fb512b56be7c064bd357120268452a6e6804aab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 17 Mar 2024 19:25:49 +0800 Subject: [PATCH 140/204] format code --- ThreadPool.md | 8 ++++++++ app/src/main/java/hxy/dream/app/Application.java | 4 ++-- .../java/hxy/dream/app/controller/AsyncController.java | 2 +- .../hxy/dream/app/controller/DeadLockController.java | 1 + .../hxy/dream/app/controller/DownloadController.java | 2 +- .../hxy/dream/app/controller/ExceptionController.java | 1 + .../java/hxy/dream/app/controller/LongController.java | 2 ++ .../hxy/dream/app/controller/TranscationController.java | 3 ++- .../app/controller/servlet/AsyncRunningServlet.java | 1 + .../hxy/dream/app/controller/servlet/AsyncServlet.java | 1 + .../dream/app/controller/servlet/MyTestReadListener.java | 1 + .../main/java/hxy/dream/app/service/DonwloadService.java | 2 ++ .../java/hxy/dream/app/service/TransactionService.java | 4 ++-- .../hxy/dream/app/service/TransactionSubService.java | 2 +- app/src/main/java/hxy/dream/app/service/UserService.java | 2 ++ .../hxy/dream/app/service/impl/DonwloadServiceImpl.java | 9 +++++---- 16 files changed, 33 insertions(+), 12 deletions(-) diff --git a/ThreadPool.md b/ThreadPool.md index f5a98a3..f4d5f04 100644 --- a/ThreadPool.md +++ b/ThreadPool.md @@ -29,6 +29,14 @@ ## SpringBoot的自带线程池 +```java + /** + * 注意这个线程池的最大线程数队列长度 + */ + @Autowired + private ThreadPoolTaskExecutor applicationTaskExecutor; + ``` + ![](asset/img/SpringBoot上下文调试.png) ![](asset/img/定位到自带线程池.png) ![](./asset/img/SpringBoot的默认线程池.png) diff --git a/app/src/main/java/hxy/dream/app/Application.java b/app/src/main/java/hxy/dream/app/Application.java index de98514..b3597bd 100644 --- a/app/src/main/java/hxy/dream/app/Application.java +++ b/app/src/main/java/hxy/dream/app/Application.java @@ -20,13 +20,13 @@ import org.springframework.scheduling.annotation.EnableAsync; @ServletComponentScan("hxy.dream") @EnableAsync public class Application { - private static final Logger log = LoggerFactory.getLogger(Application.class); + private static final Logger log = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { log.info("\n<============ \uD83D\uDE80 JAVA版本:{} CPU核心数:{} \uD83D\uDE80 ============>", System.getProperty("java.version"), Runtime.getRuntime().availableProcessors()); System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "class"); - log.info("当前CPU核心={},{}是否为守护线程={}",Runtime.getRuntime().availableProcessors(), Thread.currentThread().getName(), Thread.currentThread().isDaemon()); + log.info("当前CPU核心={},{}是否为守护线程={}", Runtime.getRuntime().availableProcessors(), Thread.currentThread().getName(), Thread.currentThread().isDaemon()); ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); log.trace("方便打断点"); } diff --git a/app/src/main/java/hxy/dream/app/controller/AsyncController.java b/app/src/main/java/hxy/dream/app/controller/AsyncController.java index a2eac25..1ded250 100644 --- a/app/src/main/java/hxy/dream/app/controller/AsyncController.java +++ b/app/src/main/java/hxy/dream/app/controller/AsyncController.java @@ -30,7 +30,7 @@ public class AsyncController { * 注意这个线程池的最大线程数队列长度 */ @Autowired - ThreadPoolTaskExecutor applicationTaskExecutor; + private ThreadPoolTaskExecutor applicationTaskExecutor; /** * 从这个接口可以更好的理解异步模型的一种实现手段就是多线程! diff --git a/app/src/main/java/hxy/dream/app/controller/DeadLockController.java b/app/src/main/java/hxy/dream/app/controller/DeadLockController.java index b8edb98..6a055f3 100644 --- a/app/src/main/java/hxy/dream/app/controller/DeadLockController.java +++ b/app/src/main/java/hxy/dream/app/controller/DeadLockController.java @@ -15,6 +15,7 @@ import java.util.concurrent.TimeUnit; @RestController @RequestMapping("/deadlock") public class DeadLockController { + Object lock = new Object(); Object lock2 = new Object(); diff --git a/app/src/main/java/hxy/dream/app/controller/DownloadController.java b/app/src/main/java/hxy/dream/app/controller/DownloadController.java index 769f16e..c17a90f 100644 --- a/app/src/main/java/hxy/dream/app/controller/DownloadController.java +++ b/app/src/main/java/hxy/dream/app/controller/DownloadController.java @@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.RestController; public class DownloadController { @Autowired - DonwloadService donwloadService; + private DonwloadService donwloadService; @GetMapping("multi") public BaseResponseVO download() { diff --git a/app/src/main/java/hxy/dream/app/controller/ExceptionController.java b/app/src/main/java/hxy/dream/app/controller/ExceptionController.java index c0089e6..43f0a18 100644 --- a/app/src/main/java/hxy/dream/app/controller/ExceptionController.java +++ b/app/src/main/java/hxy/dream/app/controller/ExceptionController.java @@ -17,6 +17,7 @@ import java.io.IOException; */ @RestController public class ExceptionController { + private static final Logger log = LoggerFactory.getLogger(ExceptionController.class); @RequestMapping("/exception") diff --git a/app/src/main/java/hxy/dream/app/controller/LongController.java b/app/src/main/java/hxy/dream/app/controller/LongController.java index 6c5f4af..723525f 100644 --- a/app/src/main/java/hxy/dream/app/controller/LongController.java +++ b/app/src/main/java/hxy/dream/app/controller/LongController.java @@ -14,6 +14,7 @@ import java.util.HashMap; */ @RestController public class LongController { + @GetMapping(value = "/long") public BaseResponseVO testLong() { HashMap map = new HashMap(); @@ -28,4 +29,5 @@ public class LongController { map.put("比较小,Browser不会失去精度的", l4); return BaseResponseVO.success(map); } + } diff --git a/app/src/main/java/hxy/dream/app/controller/TranscationController.java b/app/src/main/java/hxy/dream/app/controller/TranscationController.java index b496597..5a2de22 100644 --- a/app/src/main/java/hxy/dream/app/controller/TranscationController.java +++ b/app/src/main/java/hxy/dream/app/controller/TranscationController.java @@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import jakarta.annotation.Resource; + import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; @@ -28,7 +29,7 @@ public class TranscationController { @Resource - TransactionService transactionService; + private TransactionService transactionService; private ThreadPoolExecutor executor = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), Runtime.getRuntime().availableProcessors() * 2, 200, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(5), new ThreadPoolExecutor.CallerRunsPolicy()); diff --git a/app/src/main/java/hxy/dream/app/controller/servlet/AsyncRunningServlet.java b/app/src/main/java/hxy/dream/app/controller/servlet/AsyncRunningServlet.java index 391d3aa..cf16d34 100644 --- a/app/src/main/java/hxy/dream/app/controller/servlet/AsyncRunningServlet.java +++ b/app/src/main/java/hxy/dream/app/controller/servlet/AsyncRunningServlet.java @@ -22,6 +22,7 @@ import java.io.PrintWriter; */ @WebServlet(urlPatterns = "/AsyncRunningServlet2", asyncSupported = true) public class AsyncRunningServlet extends HttpServlet { + private static final Logger log = LoggerFactory.getLogger(AsyncRunningServlet.class); diff --git a/app/src/main/java/hxy/dream/app/controller/servlet/AsyncServlet.java b/app/src/main/java/hxy/dream/app/controller/servlet/AsyncServlet.java index 5e0f0dd..4e2d916 100644 --- a/app/src/main/java/hxy/dream/app/controller/servlet/AsyncServlet.java +++ b/app/src/main/java/hxy/dream/app/controller/servlet/AsyncServlet.java @@ -23,6 +23,7 @@ import java.io.PrintWriter; */ @WebServlet(urlPatterns = "/AsyncServlet", asyncSupported = true) public class AsyncServlet extends HttpServlet { + private static final Logger log = LoggerFactory.getLogger(AsyncServlet.class); /** diff --git a/app/src/main/java/hxy/dream/app/controller/servlet/MyTestReadListener.java b/app/src/main/java/hxy/dream/app/controller/servlet/MyTestReadListener.java index 6568d17..7efc2bd 100644 --- a/app/src/main/java/hxy/dream/app/controller/servlet/MyTestReadListener.java +++ b/app/src/main/java/hxy/dream/app/controller/servlet/MyTestReadListener.java @@ -20,6 +20,7 @@ import java.util.concurrent.TimeUnit; * @date 2/20/22 */ public class MyTestReadListener implements ReadListener { + private static final Logger log = LoggerFactory.getLogger(MyTestReadListener.class); diff --git a/app/src/main/java/hxy/dream/app/service/DonwloadService.java b/app/src/main/java/hxy/dream/app/service/DonwloadService.java index 9319951..018e824 100644 --- a/app/src/main/java/hxy/dream/app/service/DonwloadService.java +++ b/app/src/main/java/hxy/dream/app/service/DonwloadService.java @@ -9,5 +9,7 @@ import hxy.dream.entity.vo.BaseResponseVO; * @date 2020/12/24 */ public interface DonwloadService { + BaseResponseVO multipleDonwload(); + } diff --git a/app/src/main/java/hxy/dream/app/service/TransactionService.java b/app/src/main/java/hxy/dream/app/service/TransactionService.java index e232fd4..1751653 100644 --- a/app/src/main/java/hxy/dream/app/service/TransactionService.java +++ b/app/src/main/java/hxy/dream/app/service/TransactionService.java @@ -22,10 +22,10 @@ import jakarta.annotation.Resource; public class TransactionService { @Resource - UserMapper userMapper; + private UserMapper userMapper; @Resource - TransactionSubService transactionSubService; + private TransactionSubService transactionSubService; /** * 测试事务 diff --git a/app/src/main/java/hxy/dream/app/service/TransactionSubService.java b/app/src/main/java/hxy/dream/app/service/TransactionSubService.java index 8ffa161..acf53a3 100644 --- a/app/src/main/java/hxy/dream/app/service/TransactionSubService.java +++ b/app/src/main/java/hxy/dream/app/service/TransactionSubService.java @@ -18,7 +18,7 @@ import jakarta.annotation.Resource; public class TransactionSubService { @Resource - UserMapper userMapper; + private UserMapper userMapper; @Transactional(propagation = Propagation.REQUIRED) public void saveChildren() { diff --git a/app/src/main/java/hxy/dream/app/service/UserService.java b/app/src/main/java/hxy/dream/app/service/UserService.java index 1e791f7..7089e46 100644 --- a/app/src/main/java/hxy/dream/app/service/UserService.java +++ b/app/src/main/java/hxy/dream/app/service/UserService.java @@ -9,6 +9,7 @@ import java.util.List; @Service public interface UserService { + UserModel add(UserParam userParam); UserModel get(String id); @@ -18,4 +19,5 @@ public interface UserService { List list(); BaseResponseVO delete(Integer id); + } diff --git a/app/src/main/java/hxy/dream/app/service/impl/DonwloadServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/DonwloadServiceImpl.java index 105ca90..2167948 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/DonwloadServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/DonwloadServiceImpl.java @@ -15,7 +15,8 @@ import java.io.File; */ @Service public class DonwloadServiceImpl implements DonwloadService { - String url = "https://typora.io/windows/typora-setup-x64.exe"; + + private String url = "https://typora.io/windows/typora-setup-x64.exe"; @Override public BaseResponseVO multipleDonwload() { @@ -33,9 +34,9 @@ public class DonwloadServiceImpl implements DonwloadService { return null; } - void download(long totalSize, int index) { + void download(long totalSize, int index) { System.out.println("===>" + index); - String filePath = System.getProperty("user.dir") + File.separator+"typora-setup-x64-7.exe"; + String filePath = System.getProperty("user.dir") + File.separator + "typora-setup-x64-7.exe"; long size = 3 * 1024 * 1024; // 每块下载 3M long start = index * size; @@ -49,7 +50,7 @@ public class DonwloadServiceImpl implements DonwloadService { if (end < totalSize) { // 若未下载完,则继续下载下一块 download(totalSize, index + 1); } else { - System.out.println("下载完成"+filePath); + System.out.println("下载完成" + filePath); } }) .start(); -- Gitee From cfcfeeac7ee2e63e3a079dc106746d9de0b1f60b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 17 Mar 2024 21:28:32 +0800 Subject: [PATCH 141/204] optimization --- README.md | 45 +++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 6c14e25..2db34ad 100644 --- a/README.md +++ b/README.md @@ -8,22 +8,22 @@ ## 主要实现功能如下 - 功能 | 实现 | 用途 ------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------- - IDEA开发热加载实现 | JBR + HotswapAgent | https://github.com/HotswapProjects/HotswapAgent - [jackson序列化](SERIALIZE.md) | 自定义序列化器 | 解决参数枚举的序列化问题 - logback钉钉通知 | 自定义Appender | Error消息及时通知 - logback邮件通知 | 默认支持 | Error异常及时通知 - 全局异常捕获 | 默认支持 | 捕获异常 - 数据库字段加解密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 给部分数据库字段加解密 - 执行初始化SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | - [MybatisPlus的SQL脚本自动维护](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) | https://baomidou.com/pages/1812u1/ | 自动建表 - SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | - 参数全局trim() | [StringTrimDeserializer](common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java) | 避免异常数据 - Long类型超长转String | | 解决前端无法正确显示超长String - 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决字符串"null"等问题 + 功能 | 实现 | 用途 +-----------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------- + IDEA开发热加载实现 | JBR + HotswapAgent | https://github.com/HotswapProjects/HotswapAgent + [jackson序列化](SERIALIZE.md) | 自定义序列化器 [BaseEnumSerializer.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fserializer%2FBaseEnumSerializer.java) | 解决参数枚举的序列化问题 + logback钉钉通知 | 自定义Appender [LogbackDingTalkAppender.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fextend%2FLogbackDingTalkAppender.java) | Error消息及时通知 + logback邮件通知 | 默认支持 | Error异常及时通知 + 全局异常捕获 | [GlobalExceptionHandler.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fextend%2FGlobalExceptionHandler.java) | 捕获异常 + 数据库字段加解密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 给部分数据库字段加解密 + 执行初始化SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | + [MybatisPlus的SQL脚本自动维护](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) | https://baomidou.com/pages/1812u1/ | 自动建表 + SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | + 参数全局trim() | [StringTrimDeserializer](common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java) | 避免异常数据 + Long类型超长转String | [BaseLongSerializer.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fserializer%2FBaseLongSerializer.java) | 解决前端无法正确显示超长String + 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决字符串"null"等问题 敏感信息从程序外配置文件读取 | [RemoteEnvironmentPostProcessor.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FRemoteEnvironmentPostProcessor.java) 极海的方案 [DataSourceConfigLoader.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FDataSourceConfigLoader.java) | 从程序外的配置文件读取数据库的账号密码信息 - 单元测试默认配置环境 | @ActiveProfiles("test") | 解决每次修改yaml文件的烦恼 | + 单元测试默认配置环境 | [ @ActiveProfiles("test") ](app%2Fsrc%2Ftest%2Fjava%2Fhxy%2Fdream%2FBaseTest.java) | 解决每次修改yaml文件的烦恼 | 具体框架如下表: @@ -155,6 +155,14 @@ https://spring.io/projects/spring-boot#support ./gradlew dependencyInsight --dependency mybatis ``` +### 构建 + +并行构建 + +```shell +gradle build -x test --parallel --build-cache +``` + > 需要解决多工程的依赖分析 ### gradle多模块构建,依赖关系解决 @@ -312,12 +320,5 @@ https://blog.csdn.net/qq_27127145/article/details/85775240 - [x] 有的前端输入带有空格或者换行,到数据库存储可能会发生意想不到的bug,所以需要在反序列化的时候,需要将其中的非法字符去掉。需要设计一个方案做下全局的参数trim() -### 构建 - -并行构建 - -```shell -gradle build -x test --parallel --build-cache -``` https://zhuanlan.zhihu.com/p/372585663 -- Gitee From d9348d7d6b884259c961a1070505ce699a31ee62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 17 Mar 2024 21:38:45 +0800 Subject: [PATCH 142/204] optimization --- .../main/java/hxy/dream/common/filter/TokenFilter.java | 1 + .../src/main/java/hxy/dream/common/manager/RemoteApi.java | 4 ++++ .../src/main/java/hxy/dream/common/redis/RedisConfig.java | 2 +- .../hxy/dream/common/serializer/BaseEnumDeserializer.java | 3 +-- .../hxy/dream/common/serializer/DateJsonDeserializer.java | 1 + .../common/serializer/SimpleDeserializersWrapper.java | 2 +- .../main/java/hxy/dream/common/study/EricFactoryBean.java | 1 + common/src/main/java/hxy/dream/common/util/IPAddress.java | 1 + dao/src/main/java/hxy/dream/dao/UserDao.java | 8 +++++--- .../src/main/java/hxy/dream/entity/enums/GenderEnum.java | 3 +-- .../java/hxy/dream/entity/exception/BaseException.java | 1 + 11 files changed, 18 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/filter/TokenFilter.java b/common/src/main/java/hxy/dream/common/filter/TokenFilter.java index 2a3156b..2f6f465 100644 --- a/common/src/main/java/hxy/dream/common/filter/TokenFilter.java +++ b/common/src/main/java/hxy/dream/common/filter/TokenFilter.java @@ -12,6 +12,7 @@ import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import jakarta.servlet.annotation.WebFilter; import jakarta.servlet.annotation.WebInitParam; + import java.io.IOException; /** diff --git a/common/src/main/java/hxy/dream/common/manager/RemoteApi.java b/common/src/main/java/hxy/dream/common/manager/RemoteApi.java index b69b326..ee522af 100644 --- a/common/src/main/java/hxy/dream/common/manager/RemoteApi.java +++ b/common/src/main/java/hxy/dream/common/manager/RemoteApi.java @@ -5,7 +5,11 @@ import org.springframework.web.service.annotation.HttpExchange; /** * 通过RPC/Http调用远程的服务请求 + * * @author iris + * @see hxy.dream.common.configuration.RemoteApiConfig + *

+ * 还可以看看 Retrofit */ @HttpExchange public interface RemoteApi { diff --git a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java index 2a07cb8..ddd3df7 100644 --- a/common/src/main/java/hxy/dream/common/redis/RedisConfig.java +++ b/common/src/main/java/hxy/dream/common/redis/RedisConfig.java @@ -37,7 +37,7 @@ import java.util.Set; public class RedisConfig extends CachingConfigurerSupport { @Autowired - RedisConnectionFactory redisConnectionFactory; + private RedisConnectionFactory redisConnectionFactory; /** * 这个仅仅针对Redis 序列化问题解决! 不能纳入到全局,否则会造成返回前端带上了类名。 diff --git a/common/src/main/java/hxy/dream/common/serializer/BaseEnumDeserializer.java b/common/src/main/java/hxy/dream/common/serializer/BaseEnumDeserializer.java index bcea3ad..709c15e 100644 --- a/common/src/main/java/hxy/dream/common/serializer/BaseEnumDeserializer.java +++ b/common/src/main/java/hxy/dream/common/serializer/BaseEnumDeserializer.java @@ -24,6 +24,7 @@ import java.lang.reflect.Field; */ @Slf4j public class BaseEnumDeserializer extends JsonDeserializer { + @Override public BaseEnum deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { @@ -34,7 +35,6 @@ public class BaseEnumDeserializer extends JsonDeserializer { return null; } - JsonStreamContext parsingContext = jp.getParsingContext(); //前端注入的对象(ResDTO) @@ -98,6 +98,5 @@ public class BaseEnumDeserializer extends JsonDeserializer { throw new RuntimeException(e); } - } } diff --git a/common/src/main/java/hxy/dream/common/serializer/DateJsonDeserializer.java b/common/src/main/java/hxy/dream/common/serializer/DateJsonDeserializer.java index 34eee46..dea3ad3 100644 --- a/common/src/main/java/hxy/dream/common/serializer/DateJsonDeserializer.java +++ b/common/src/main/java/hxy/dream/common/serializer/DateJsonDeserializer.java @@ -9,6 +9,7 @@ import java.text.SimpleDateFormat; import java.util.Date; public class DateJsonDeserializer extends JsonDeserializer { + public static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static final SimpleDateFormat format2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); diff --git a/common/src/main/java/hxy/dream/common/serializer/SimpleDeserializersWrapper.java b/common/src/main/java/hxy/dream/common/serializer/SimpleDeserializersWrapper.java index 1bfbac6..137d9a8 100644 --- a/common/src/main/java/hxy/dream/common/serializer/SimpleDeserializersWrapper.java +++ b/common/src/main/java/hxy/dream/common/serializer/SimpleDeserializersWrapper.java @@ -11,7 +11,7 @@ import org.slf4j.LoggerFactory; public class SimpleDeserializersWrapper extends SimpleDeserializers { - static final Logger logger = LoggerFactory.getLogger(SimpleDeserializersWrapper.class); + private static final Logger logger = LoggerFactory.getLogger(SimpleDeserializersWrapper.class); @Override public JsonDeserializer findEnumDeserializer(Class type, DeserializationConfig config, BeanDescription beanDesc) throws JsonMappingException { diff --git a/common/src/main/java/hxy/dream/common/study/EricFactoryBean.java b/common/src/main/java/hxy/dream/common/study/EricFactoryBean.java index cc7259b..a91cb79 100644 --- a/common/src/main/java/hxy/dream/common/study/EricFactoryBean.java +++ b/common/src/main/java/hxy/dream/common/study/EricFactoryBean.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Component; */ @Component public class EricFactoryBean implements FactoryBean { + @Override public EricService getObject() throws Exception { return new EricService(); diff --git a/common/src/main/java/hxy/dream/common/util/IPAddress.java b/common/src/main/java/hxy/dream/common/util/IPAddress.java index f29936d..3adad75 100644 --- a/common/src/main/java/hxy/dream/common/util/IPAddress.java +++ b/common/src/main/java/hxy/dream/common/util/IPAddress.java @@ -11,6 +11,7 @@ import java.net.UnknownHostException; * 经过实际验证确实可以取到nginx代理后的真实客户端地址 */ public class IPAddress { + private static final Logger log = LoggerFactory.getLogger(IPAddress.class); /** diff --git a/dao/src/main/java/hxy/dream/dao/UserDao.java b/dao/src/main/java/hxy/dream/dao/UserDao.java index f22b270..c76ac37 100644 --- a/dao/src/main/java/hxy/dream/dao/UserDao.java +++ b/dao/src/main/java/hxy/dream/dao/UserDao.java @@ -3,22 +3,24 @@ package hxy.dream.dao; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import hxy.dream.dao.mapper.UserMapper; import hxy.dream.dao.model.UserModel; +import jakarta.annotation.Resource; import org.springframework.stereotype.Component; -import jakarta.annotation.Resource; import java.util.List; /** * @author iris + * 没有必要添加DAO层 */ +@Deprecated @Component public class UserDao { @Resource - UserMapper userMapper; + private UserMapper userMapper; public List selectByName(String name) { - QueryWrapper objectQueryWrapper = new QueryWrapper(); + QueryWrapper objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("name", name); return userMapper.selectList(objectQueryWrapper); } diff --git a/entity/src/main/java/hxy/dream/entity/enums/GenderEnum.java b/entity/src/main/java/hxy/dream/entity/enums/GenderEnum.java index c2889f0..be6d78b 100644 --- a/entity/src/main/java/hxy/dream/entity/enums/GenderEnum.java +++ b/entity/src/main/java/hxy/dream/entity/enums/GenderEnum.java @@ -8,8 +8,8 @@ import java.util.Optional; public enum GenderEnum implements BaseEnum { - BOY(100, "男"), GIRL(200, "女"), UNKNOWN(0, "未知"); + BOY(100, "男"), GIRL(200, "女"), UNKNOWN(0, "未知"); @EnumValue//标记数据库存的值是code private final Integer code; @@ -21,7 +21,6 @@ public enum GenderEnum implements BaseEnum { this.description = description; } - public static GenderEnum getEnumByCode(Integer code) { // for (GenderEnum genderEnum:values()){ // if (genderEnum.code.equals(code)){ diff --git a/entity/src/main/java/hxy/dream/entity/exception/BaseException.java b/entity/src/main/java/hxy/dream/entity/exception/BaseException.java index 8cb0006..159c5bb 100644 --- a/entity/src/main/java/hxy/dream/entity/exception/BaseException.java +++ b/entity/src/main/java/hxy/dream/entity/exception/BaseException.java @@ -10,6 +10,7 @@ import lombok.EqualsAndHashCode; @Data @EqualsAndHashCode(callSuper = false) public class BaseException extends RuntimeException { + private String message; private int code = 0; -- Gitee From eb2740cfde6d09f5cb97e4b012c9e010ee9c0e36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 17 Mar 2024 21:48:14 +0800 Subject: [PATCH 143/204] =?UTF-8?q?=E5=AF=B9=E4=BA=8E=20Java=20=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E8=AE=B0=E5=BD=95=EF=BC=88Record=EF=BC=89=EF=BC=8C?= =?UTF-8?q?=E4=BD=A0=E6=97=A0=E6=B3=95=E7=9B=B4=E6=8E=A5=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E5=87=BD=E6=95=B0=E6=88=96=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E6=9D=A5=E4=B8=BA=E5=85=B6=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E8=B5=8B=E5=80=BC=EF=BC=8C=E5=9B=A0=E4=B8=BA=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E6=98=AF=E4=B8=8D=E5=8F=AF=E5=8F=98=E7=9A=84=EF=BC=8C=E5=85=B6?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E6=98=AF=20final=20=E7=9A=84=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E4=B8=94=E7=94=B1=E7=BC=96=E8=AF=91=E5=99=A8=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E7=94=9F=E6=88=90=20getter=20=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E3=80=82=E8=A6=81=E5=88=9B=E5=BB=BA=E5=B9=B6=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E7=9A=84=E5=AE=9E=E4=BE=8B=EF=BC=8C=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E4=BD=BF=E7=94=A8=E8=AE=B0=E5=BD=95=E7=9A=84=E6=9E=84?= =?UTF-8?q?=E9=80=A0=E5=87=BD=E6=95=B0=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entity/src/main/java/hxy/dream/entity/dto/OtherInfo.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/entity/src/main/java/hxy/dream/entity/dto/OtherInfo.java b/entity/src/main/java/hxy/dream/entity/dto/OtherInfo.java index d161f2e..df521db 100644 --- a/entity/src/main/java/hxy/dream/entity/dto/OtherInfo.java +++ b/entity/src/main/java/hxy/dream/entity/dto/OtherInfo.java @@ -2,7 +2,13 @@ package hxy.dream.entity.dto; import lombok.Data; -// 貌似没有setter方法 +/** + * 对于 Java 中的记录(Record),你无法直接使用构造函数或公共方法来为其字段赋值,因为记录是不可变的,其字段是 final 的,并且由编译器自动生成 getter 方法。要创建并设置记录的实例,可以使用记录的构造函数。 + * 貌似没有setter方法 + * + * @param sex + * @param city + */ public record OtherInfo(String sex, String city) { } -- Gitee From f39c4afbeada359bbfc44b5caa64e3dee30c43bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 9 Apr 2024 13:12:02 +0800 Subject: [PATCH 144/204] =?UTF-8?q?=E5=8F=AA=E9=9C=80=E8=A6=81mybatis-spri?= =?UTF-8?q?ng-boot-starter=E5=8D=B3=E5=8F=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuration/DataSourceConfigLoader.java | 14 ++++++++++---- .../mybatis/BasicInfoDTOTypeHandler.java | 2 +- entity/build.gradle | 3 +-- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java index 4a461ee..67bed6b 100644 --- a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java +++ b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java @@ -3,7 +3,7 @@ package hxy.dream.common.configuration; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; -import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; @@ -37,17 +37,23 @@ public class DataSourceConfigLoader implements BeanPostProcessor, EnvironmentAwa @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - if (bean instanceof MybatisAutoConfiguration) { //在mybatis初始化前搞定配置信息 + if (bean instanceof MybatisPlusAutoConfiguration) { //在mybatis初始化前搞定配置信息 Map systemProperties = environment.getSystemProperties(); // 读取配置文件,从配置文件中加载这个变量。 String database = System.getProperty("user.home") + "/.config/eric-config/database.json"; ObjectMapper objectMapper = new ObjectMapper(); try { JsonNode jsonObject = objectMapper.readTree(new File(database)); - String databaseUrl = jsonObject.get("spring.r2dbc.url").textValue(); + + String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); String password = jsonObject.get("spring.datasource.password").textValue(); - systemProperties.put("spring.r2dbc.url", databaseUrl); + systemProperties.put("spring.datasource.url", databaseUrl); + systemProperties.put("spring.datasource.username", databaseUsername); + systemProperties.put("spring.datasource.password", password); + + String r2dbcDatabaseUrl = jsonObject.get("spring.r2dbc.url").textValue(); + systemProperties.put("spring.r2dbc.url", r2dbcDatabaseUrl); systemProperties.put("spring.r2dbc.username", databaseUsername); systemProperties.put("spring.r2dbc.password", password); } catch (JsonProcessingException e) { diff --git a/dao/src/main/java/hxy/dream/dao/configuration/mybatis/BasicInfoDTOTypeHandler.java b/dao/src/main/java/hxy/dream/dao/configuration/mybatis/BasicInfoDTOTypeHandler.java index 0421f96..5cae7e6 100644 --- a/dao/src/main/java/hxy/dream/dao/configuration/mybatis/BasicInfoDTOTypeHandler.java +++ b/dao/src/main/java/hxy/dream/dao/configuration/mybatis/BasicInfoDTOTypeHandler.java @@ -24,7 +24,7 @@ public class BasicInfoDTOTypeHandler extends JacksonTypeHandler { } @Override - protected Object parse(String json) { + public Object parse(String json) { try { return getObjectMapper().readValue(json, new TypeReference>() { }); diff --git a/entity/build.gradle b/entity/build.gradle index 7cdec3c..38e36a1 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,8 +8,7 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-boot-starter:3.5.5' // https://github.com/baomidou/mybatis-plus - api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3' + api 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.6' api 'org.springframework.boot:spring-boot-starter-validation' api 'jakarta.annotation:jakarta.annotation-api:2.1.1' -- Gitee From 7b097cfdc4d22e95298ccbf0663ccaacc516c27f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 10 Apr 2024 14:27:41 +0800 Subject: [PATCH 145/204] =?UTF-8?q?AES=E5=8A=A0=E5=AF=86=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../mybatis/CustomTypeHandler.java | 11 +- .../hxy/dream/dao/util/AesCbcEncryption.java | 127 ++++++++++++++++++ 3 files changed, 133 insertions(+), 7 deletions(-) create mode 100644 dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java diff --git a/build.gradle b/build.gradle index c1991b5..adc4b4f 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.2.3' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.2.4' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() diff --git a/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java b/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java index f9ab893..5144bf3 100644 --- a/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java +++ b/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java @@ -1,8 +1,7 @@ package hxy.dream.dao.configuration.mybatis; import com.baomidou.mybatisplus.core.toolkit.StringUtils; - -import hxy.dream.dao.util.KeyCenterUtils; +import hxy.dream.dao.util.AesCbcEncryption; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import org.springframework.stereotype.Service; @@ -27,26 +26,26 @@ public class CustomTypeHandler extends BaseTypeHandler { @Override public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { - ps.setString(i, KeyCenterUtils.encrypt((String) parameter)); + ps.setString(i, AesCbcEncryption.encrypt((String) parameter)); } @Override public T getNullableResult(ResultSet rs, String columnName) throws SQLException { String columnValue = rs.getString(columnName); //有一些可能是空字符 - return StringUtils.isBlank(columnValue) ? (T) columnValue : (T) KeyCenterUtils.decrypt(columnValue); + return StringUtils.isBlank(columnValue) ? (T) columnValue : (T) AesCbcEncryption.decrypt(columnValue); } @Override public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String columnValue = rs.getString(columnIndex); - return StringUtils.isBlank(columnValue) ? (T) columnValue : (T) KeyCenterUtils.decrypt(columnValue); + return StringUtils.isBlank(columnValue) ? (T) columnValue : (T) AesCbcEncryption.decrypt(columnValue); } @Override public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String columnValue = cs.getString(columnIndex); - return StringUtils.isBlank(columnValue) ? (T) columnValue : (T) KeyCenterUtils.decrypt(columnValue); + return StringUtils.isBlank(columnValue) ? (T) columnValue : (T) AesCbcEncryption.decrypt(columnValue); } } diff --git a/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java b/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java new file mode 100644 index 0000000..b5bad2a --- /dev/null +++ b/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java @@ -0,0 +1,127 @@ +package hxy.dream.dao.util; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.StandardCharsets; +import java.util.Base64; + + +public class AesCbcEncryption { + + private static final Logger log = LoggerFactory.getLogger(AesCbcEncryption.class); + + private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; + private static final int KEY_SIZE = 128; + // 使用与Golang相同的key和iv + static String key = "qwertyuiopasdfgr"; + static String iv = "qwertyuiopasdfgh"; + + public static void main(String[] args) { + try { + // 原始明文 + String plaintext = "oooooo灰灰"; + + + System.out.println("明文:" + plaintext); + System.out.println("key:" + key); + System.out.println("iv:" + iv); + + // 加密 + byte[] encrypted = cbcEncrypt(plaintext.getBytes(StandardCharsets.UTF_8), key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8)); + String encryptedString = bytesToHex(encrypted); + System.out.println("加密后的密文:" + encryptedString); + + // Base64编码 + String encryptedBase64 = base64Encode(encrypted); + System.out.println("Base64编码后的密文:" + encryptedBase64); + + // 解密 + byte[] encrypted1 = hexToBytes(encryptedString); + byte[] decrypted = cbcDecrypt(encrypted1, key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8)); + String decryptedText = new String(decrypted, StandardCharsets.UTF_8); + System.out.println("解密后的明文:" + decryptedText); + + // 封装后的测试 + String encrypt = encrypt(plaintext); + System.out.println("加密后的base64文本:" + encrypt); + String decrypt = decrypt(encrypt); + System.out.println("解密后的文本:" + decrypt); + + + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static String encrypt(String rawString) { + byte[] encrypted = null; + try { + encrypted = cbcEncrypt(rawString.getBytes(StandardCharsets.UTF_8), key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + log.error("{}", e.getMessage(), e); + } + String encryptedString = bytesToHex(encrypted); + System.out.println("加密后的密文:" + encryptedString); + + // Base64编码 + String encryptedBase64 = base64Encode(encrypted); + return encryptedBase64; + } + + public static String decrypt(String encryptedBase64) { + byte[] encrypted1 = base64Decode(encryptedBase64); + byte[] decrypted = null; + try { + decrypted = cbcDecrypt(encrypted1, key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8)); + } catch (Exception e) { + log.error("{}", e.getMessage(), e); + } + String decryptedText = new String(decrypted, StandardCharsets.UTF_8); + return decryptedText; + } + + private static byte[] cbcEncrypt(byte[] text, byte[] key, byte[] iv) throws Exception { + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + SecretKeySpec secretKey = new SecretKeySpec(key, "AES"); + IvParameterSpec ivSpec = new IvParameterSpec(iv); + cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec); + return cipher.doFinal(text); + } + + private static byte[] cbcDecrypt(byte[] encrypted, byte[] key, byte[] iv) throws Exception { + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + SecretKeySpec secretKey = new SecretKeySpec(key, "AES"); + IvParameterSpec ivSpec = new IvParameterSpec(iv); + cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec); + return cipher.doFinal(encrypted); + } + + private static String bytesToHex(byte[] bytes) { + StringBuilder sb = new StringBuilder(); + for (byte b : bytes) { + sb.append(String.format("%02X", b & 0xFF)); + } + return sb.toString(); + } + + public static String base64Encode(byte[] data) { + return Base64.getEncoder().encodeToString(data); + } + + public static byte[] base64Decode(String rawString) { + return Base64.getDecoder().decode(rawString.getBytes()); + } + + private static byte[] hexToBytes(String hex) { + int length = hex.length(); + byte[] bytes = new byte[length / 2]; + for (int i = 0; i < length; i += 2) { + bytes[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + Character.digit(hex.charAt(i + 1), 16)); + } + return bytes; + } +} -- Gitee From 59a0929b5d5385cc1530dad66d0c9c0bf130401f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 10 Apr 2024 14:41:09 +0800 Subject: [PATCH 146/204] =?UTF-8?q?=E5=8E=BB=E6=8E=89main=E6=96=B9?= =?UTF-8?q?=E6=B3=95=20Unable=20to=20find=20a=20single=20main=20class=20fr?= =?UTF-8?q?om=20the=20following=20candidates=20[hxy.dream.dao.util.RSAEncr?= =?UTF-8?q?yption,=20hxy.dream.dao.util.AesCbcEncryption]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hxy/dream/dao/util/AesCbcEncryption.java | 72 +++++++++---------- .../hxy/dream/dao/util/RSAEncryption.java | 20 +++--- settings.gradle | 3 +- 3 files changed, 47 insertions(+), 48 deletions(-) diff --git a/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java b/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java index b5bad2a..788f40a 100644 --- a/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java +++ b/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java @@ -20,42 +20,42 @@ public class AesCbcEncryption { static String key = "qwertyuiopasdfgr"; static String iv = "qwertyuiopasdfgh"; - public static void main(String[] args) { - try { - // 原始明文 - String plaintext = "oooooo灰灰"; - - - System.out.println("明文:" + plaintext); - System.out.println("key:" + key); - System.out.println("iv:" + iv); - - // 加密 - byte[] encrypted = cbcEncrypt(plaintext.getBytes(StandardCharsets.UTF_8), key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8)); - String encryptedString = bytesToHex(encrypted); - System.out.println("加密后的密文:" + encryptedString); - - // Base64编码 - String encryptedBase64 = base64Encode(encrypted); - System.out.println("Base64编码后的密文:" + encryptedBase64); - - // 解密 - byte[] encrypted1 = hexToBytes(encryptedString); - byte[] decrypted = cbcDecrypt(encrypted1, key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8)); - String decryptedText = new String(decrypted, StandardCharsets.UTF_8); - System.out.println("解密后的明文:" + decryptedText); - - // 封装后的测试 - String encrypt = encrypt(plaintext); - System.out.println("加密后的base64文本:" + encrypt); - String decrypt = decrypt(encrypt); - System.out.println("解密后的文本:" + decrypt); - - - } catch (Exception e) { - e.printStackTrace(); - } - } +// public static void main(String[] args) { +// try { +// // 原始明文 +// String plaintext = "oooooo灰灰"; +// +// +// System.out.println("明文:" + plaintext); +// System.out.println("key:" + key); +// System.out.println("iv:" + iv); +// +// // 加密 +// byte[] encrypted = cbcEncrypt(plaintext.getBytes(StandardCharsets.UTF_8), key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8)); +// String encryptedString = bytesToHex(encrypted); +// System.out.println("加密后的密文:" + encryptedString); +// +// // Base64编码 +// String encryptedBase64 = base64Encode(encrypted); +// System.out.println("Base64编码后的密文:" + encryptedBase64); +// +// // 解密 +// byte[] encrypted1 = hexToBytes(encryptedString); +// byte[] decrypted = cbcDecrypt(encrypted1, key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8)); +// String decryptedText = new String(decrypted, StandardCharsets.UTF_8); +// System.out.println("解密后的明文:" + decryptedText); +// +// // 封装后的测试 +// String encrypt = encrypt(plaintext); +// System.out.println("加密后的base64文本:" + encrypt); +// String decrypt = decrypt(encrypt); +// System.out.println("解密后的文本:" + decrypt); +// +// +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } public static String encrypt(String rawString) { byte[] encrypted = null; diff --git a/dao/src/main/java/hxy/dream/dao/util/RSAEncryption.java b/dao/src/main/java/hxy/dream/dao/util/RSAEncryption.java index 9160560..7600b97 100644 --- a/dao/src/main/java/hxy/dream/dao/util/RSAEncryption.java +++ b/dao/src/main/java/hxy/dream/dao/util/RSAEncryption.java @@ -188,16 +188,16 @@ public class RSAEncryption { * * @param args */ - public static void main(String[] args) { - - String input = "Hello World!"; -// second(input); - - String s = infoEncrypt(input); - System.out.println("加密后密码" + s); - String s1 = infoDecrypt(s); - System.out.println("解密后的密码" + s1); - } +// public static void main(String[] args) { +// +// String input = "Hello World!"; +//// second(input); +// +// String s = infoEncrypt(input); +// System.out.println("加密后密码" + s); +// String s1 = infoDecrypt(s); +// System.out.println("解密后的密码" + s1); +// } static String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCLUKF8+tqeLt+MESnrFxrUDkt56MocLoh/On2I\n" + "+jm/0W+BcnAlPC3Q6xH5lQjNklqcN+XldKmGqkDQS/qT9/ZcNWNv1oI7skAP7TqPupRdMIzvd0rg\n" + diff --git a/settings.gradle b/settings.gradle index d27159b..1a4934b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -10,5 +10,4 @@ rootProject.name = 'multi-gradle' include 'app' include 'entity' include 'dao' -include 'common' - +include 'common' \ No newline at end of file -- Gitee From 2405e207018da1a37cfa6e710ef4e2faa0e08ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 10 Apr 2024 16:44:55 +0800 Subject: [PATCH 147/204] HotswapAgent --- README.md | 39 ++++++++++-------- .../app/controller/SystemController.java | 2 +- img.png | Bin 0 -> 120084 bytes 3 files changed, 22 insertions(+), 19 deletions(-) create mode 100644 img.png diff --git a/README.md b/README.md index 2db34ad..16c0a60 100644 --- a/README.md +++ b/README.md @@ -8,22 +8,22 @@ ## 主要实现功能如下 - 功能 | 实现 | 用途 ------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------- - IDEA开发热加载实现 | JBR + HotswapAgent | https://github.com/HotswapProjects/HotswapAgent - [jackson序列化](SERIALIZE.md) | 自定义序列化器 [BaseEnumSerializer.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fserializer%2FBaseEnumSerializer.java) | 解决参数枚举的序列化问题 - logback钉钉通知 | 自定义Appender [LogbackDingTalkAppender.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fextend%2FLogbackDingTalkAppender.java) | Error消息及时通知 - logback邮件通知 | 默认支持 | Error异常及时通知 - 全局异常捕获 | [GlobalExceptionHandler.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fextend%2FGlobalExceptionHandler.java) | 捕获异常 - 数据库字段加解密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 给部分数据库字段加解密 - 执行初始化SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | - [MybatisPlus的SQL脚本自动维护](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) | https://baomidou.com/pages/1812u1/ | 自动建表 - SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | - 参数全局trim() | [StringTrimDeserializer](common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java) | 避免异常数据 - Long类型超长转String | [BaseLongSerializer.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fserializer%2FBaseLongSerializer.java) | 解决前端无法正确显示超长String - 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决字符串"null"等问题 + 功能 | 实现 | 用途 +-----------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------- + IDEA开发热加载实现 | JBR + HotswapAgent | https://github.com/HotswapProjects/HotswapAgent + [jackson序列化](SERIALIZE.md) | 自定义序列化器 [BaseEnumSerializer.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fserializer%2FBaseEnumSerializer.java) | 解决参数枚举的序列化问题 + logback钉钉通知 | 自定义Appender [LogbackDingTalkAppender.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fextend%2FLogbackDingTalkAppender.java) | Error消息及时通知 + logback邮件通知 | 默认支持 | Error异常及时通知 + 全局异常捕获 | [GlobalExceptionHandler.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fextend%2FGlobalExceptionHandler.java) | 捕获异常 + 数据库字段加解密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 给部分数据库字段加解密 + 执行初始化SQL语句 | [自动建表](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) | + [MybatisPlus的SQL脚本自动维护](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) | https://baomidou.com/pages/1812u1/ | 自动建表 + SpringBoot 3.0 声明式API远程调用 | 参考 [RemoteApi](common/src/main/java/hxy/dream/common/manager/RemoteApi.java) | + 参数全局trim() | [StringTrimDeserializer](common/src/main/java/hxy/dream/common/serializer/StringTrimDeserializer.java) | 避免异常数据 + Long类型超长转String | [BaseLongSerializer.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fserializer%2FBaseLongSerializer.java) | 解决前端无法正确显示超长String + 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决字符串"null"等问题 敏感信息从程序外配置文件读取 | [RemoteEnvironmentPostProcessor.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FRemoteEnvironmentPostProcessor.java) 极海的方案 [DataSourceConfigLoader.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FDataSourceConfigLoader.java) | 从程序外的配置文件读取数据库的账号密码信息 - 单元测试默认配置环境 | [ @ActiveProfiles("test") ](app%2Fsrc%2Ftest%2Fjava%2Fhxy%2Fdream%2FBaseTest.java) | 解决每次修改yaml文件的烦恼 | + 单元测试默认配置环境 | [ @ActiveProfiles("test") ](app%2Fsrc%2Ftest%2Fjava%2Fhxy%2Fdream%2FBaseTest.java) | 解决每次修改yaml文件的烦恼 | 具体框架如下表: @@ -41,7 +41,11 @@ https://github.com/HotswapProjects/HotswapAgent ![img_1.png](asset/img/update-vm-param.png) -Ctrl + Shift + F9 重新编译和加载修改的类文件即可。 +![img.png](img.png) + +注意需要在**debug**模式下启动才能生效。 + +Build -> Rebuild Project (Ctrl + Shift + F9) 重新编译和加载修改的类文件即可。 > http://blog.houxiaoyi.cn/#/src/Java/%E7%83%AD%E5%8A%A0%E8%BD%BD @@ -289,7 +293,7 @@ https://blog.csdn.net/bandancer/article/details/84926383 [关于springboot中添加Filter的方法](https://www.jianshu.com/p/3d421fbce734) -### +### ``` WARN at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive (PoolBase.java:184) - HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@63ec6a5a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. @@ -320,5 +324,4 @@ https://blog.csdn.net/qq_27127145/article/details/85775240 - [x] 有的前端输入带有空格或者换行,到数据库存储可能会发生意想不到的bug,所以需要在反序列化的时候,需要将其中的非法字符去掉。需要设计一个方案做下全局的参数trim() - https://zhuanlan.zhihu.com/p/372585663 diff --git a/app/src/main/java/hxy/dream/app/controller/SystemController.java b/app/src/main/java/hxy/dream/app/controller/SystemController.java index 42012b9..f3982b0 100644 --- a/app/src/main/java/hxy/dream/app/controller/SystemController.java +++ b/app/src/main/java/hxy/dream/app/controller/SystemController.java @@ -25,7 +25,7 @@ public class SystemController { // e.printStackTrace(); // } try { - TimeUnit.SECONDS.sleep(5); + TimeUnit.SECONDS.sleep(0); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/img.png b/img.png new file mode 100644 index 0000000000000000000000000000000000000000..60abe6e4f7111eaeaeaf211b5e7f183c9d26186e GIT binary patch literal 120084 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 Bp6>tv literal 0 HcmV?d00001 -- Gitee From aa4bffccc4036f77be4302f2ac0066c3c49f9dd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 10 Apr 2024 17:16:01 +0800 Subject: [PATCH 148/204] jdk17 21 --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 16c0a60..115fef3 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ https://www.azul.com/ ### 热加载技术 +这个针对的是Jetbrain Runtime ,所以其他JDK慎重。实际测试jdk17 21都可以正常运行。 + https://github.com/HotswapProjects/HotswapAgent ```shell @@ -45,7 +47,7 @@ https://github.com/HotswapProjects/HotswapAgent 注意需要在**debug**模式下启动才能生效。 -Build -> Rebuild Project (Ctrl + Shift + F9) 重新编译和加载修改的类文件即可。 +修改代码后,Build -> Rebuild Project (Ctrl + Shift + F9) 重新编译和加载修改的类文件即可生效。 > http://blog.houxiaoyi.cn/#/src/Java/%E7%83%AD%E5%8A%A0%E8%BD%BD @@ -293,7 +295,7 @@ https://blog.csdn.net/bandancer/article/details/84926383 [关于springboot中添加Filter的方法](https://www.jianshu.com/p/3d421fbce734) -### +### ``` WARN at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive (PoolBase.java:184) - HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@63ec6a5a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -- Gitee From dabf5638cfea1dd8383ed7908c5e9806623e0a29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 10 Apr 2024 17:26:00 +0800 Subject: [PATCH 149/204] https://github.com/JetBrains/JetBrainsRuntime/releases --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 115fef3..350f80a 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ https://www.azul.com/ ### 热加载技术 -这个针对的是Jetbrain Runtime ,所以其他JDK慎重。实际测试jdk17 21都可以正常运行。 +这个针对的是[Jetbrains Runtime](https://github.com/JetBrains/JetBrainsRuntime/releases) ,所以其他JDK慎重。实际测试jdk17 21都可以正常运行。 https://github.com/HotswapProjects/HotswapAgent -- Gitee From 2292a731c876112fbf70d0702bbfb7e19363b44a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 11 Apr 2024 14:09:14 +0800 Subject: [PATCH 150/204] update README.md --- .fleet/run.json | 25 ++++++++++++++++++ README.md | 2 +- img.png => asset/img/HotswapAgentLocation.png | Bin 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 .fleet/run.json rename img.png => asset/img/HotswapAgentLocation.png (100%) diff --git a/.fleet/run.json b/.fleet/run.json new file mode 100644 index 0000000..8d00d7a --- /dev/null +++ b/.fleet/run.json @@ -0,0 +1,25 @@ +{ + "configurations": [ + + { + "name": "Build SpringCloud-multiple-gradle", + "type": "gradle", + "workingDir": "$PROJECT_DIR$", + "tasks": [":app:classes"], + "initScripts": { + "flmapper": "ext.mapPath = { path -> null }", + "Build SpringCloud-multiple-gradle": "System.setProperty('org.gradle.java.compile-classpath-packaging', 'true')" + } + }, + { + "name": "Application", + "type": "spring-boot", + "workingDir": "$PROJECT_DIR$", + "dependsOn": ["Build SpringCloud-multiple-gradle"], + "mainClass": "hxy.dream.app.Application", + "module": "multi-gradle.app.main", + "options": ["-XX:TieredStopAtLevel=1", "-Dspring.output.ansi.enabled=always", "-Dcom.sun.management.jmxremote", "-Dspring.jmx.enabled=true", "-Dspring.liveBeansView.mbeanDomain", "-Dspring.application.admin.enabled=true", "-Dmanagement.endpoints.jmx.exposure.include=*", "-Dfile.encoding=UTF-8", "-Dsun.stdout.encoding=UTF-8", "-Dsun.stderr.encoding=UTF-8", "-classpath", "$USER_HOME$/.m2/repository/org/projectlombok/lombok/1.18.30/lombok-1.18.30.jar:$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.javassist/javassist/3.22.0-GA/3e83394258ae2089be7219b971ec21a8288528ad/javassist-3.22.0-GA.jar"], + "activeProfiles": ["test"] + } + ] +} \ No newline at end of file diff --git a/README.md b/README.md index 350f80a..a40a21f 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ https://github.com/HotswapProjects/HotswapAgent ![img_1.png](asset/img/update-vm-param.png) -![img.png](img.png) +![img.png](asset/img/HotswapAgentLocation.png) 注意需要在**debug**模式下启动才能生效。 diff --git a/img.png b/asset/img/HotswapAgentLocation.png similarity index 100% rename from img.png rename to asset/img/HotswapAgentLocation.png -- Gitee From c1ee9ec6e7ff09361a1da437595f1cffb4c635e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 30 Apr 2024 10:43:08 +0800 Subject: [PATCH 151/204] okhttps --- README.md | 3 ++- app/build.gradle | 5 +++-- .../dream/app/service/impl/DonwloadServiceImpl.java | 2 +- build.gradle | 2 +- common/build.gradle | 11 ++++++----- entity/build.gradle | 2 +- 6 files changed, 14 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index a40a21f..8b0b1e1 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,7 @@ https\://services.gradle.org/distributions/gradle-7.4-bin.zip Lombok | 简化对象封装工具 | [https://github.com/rzwitserloot/lombok](https://github.com/rzwitserloot/lombok) loc | 代码行数统计 | https://github.com/cgag/loc ko-time | 轻量级的springboot项目性能分析工具,通过追踪方法调用链路以及对应的运行时长快速定位性能瓶颈 | https://gitee.com/huoyo/ko-time + okhttps | 强大轻量 且 前后端通用的 HTTP 客户端,同时支持 WebSocket 以及 Stomp 协议 | https://ok.zhxu.cn/ #### SpringBoot支持 @@ -295,7 +296,7 @@ https://blog.csdn.net/bandancer/article/details/84926383 [关于springboot中添加Filter的方法](https://www.jianshu.com/p/3d421fbce734) -### +### ``` WARN at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive (PoolBase.java:184) - HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@63ec6a5a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. diff --git a/app/build.gradle b/app/build.gradle index cd5c9f2..09e6081 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,11 +7,12 @@ bootJar.enabled = true dependencies { api project(':common') + implementation 'cn.zhxu:okhttps:4.0.2' implementation 'org.springframework.data:spring-data-redis' // implementation 'org.springframework.cloud:spring-cloud-starter-sleuth:3.1.7' // 已经不支持了 - implementation('com.yomahub:tlog-all-spring-boot-starter:1.5.1') { +// implementation('com.yomahub:tlog-all-spring-boot-starter:1.5.1') { // exclude group: 'pull-parser', module: 'pull-parser' - } +// } implementation 'org.dom4j:dom4j:2.1.4' // implementation 'pull-parser:pull-parser:2.1.10' } diff --git a/app/src/main/java/hxy/dream/app/service/impl/DonwloadServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/DonwloadServiceImpl.java index 2167948..88bfd44 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/DonwloadServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/DonwloadServiceImpl.java @@ -1,9 +1,9 @@ package hxy.dream.app.service.impl; -import com.ejlchina.okhttps.OkHttps; import hxy.dream.app.service.DonwloadService; import hxy.dream.entity.vo.BaseResponseVO; import org.springframework.stereotype.Service; +import cn.zhxu.okhttps.OkHttps; import java.io.File; diff --git a/build.gradle b/build.gradle index adc4b4f..74ecbde 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.2.4' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.2.5' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() diff --git a/common/build.gradle b/common/build.gradle index 7fa4f2f..424f09b 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -15,17 +15,18 @@ repositories { dependencies { api project(':dao') /* 子模块之间的依赖 */ - api 'com.ejlchina:okhttps-jackson:3.5.3' + implementation 'cn.zhxu:okhttps:4.0.2' + implementation 'cn.zhxu:okhttps-jackson:4.0.2' api 'org.springframework.boot:spring-boot-starter-mail' implementation 'org.springframework.data:spring-data-redis' implementation 'redis.clients:jedis' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.15.2' // Java 8 Datatypes - implementation 'com.fasterxml.jackson:jackson-bom:2.15.2' // Java 8 Datatypes - implementation group: 'org.javassist', name: 'javassist', version: '3.27.0-GA' - implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.19' - implementation 'org.redisson:redisson:3.15.0' + implementation 'com.fasterxml.jackson:jackson-bom:2.17.0' // Java 8 Datatypes + implementation group: 'org.javassist', name: 'javassist', version: '3.30.2-GA' + implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.22' + implementation 'org.redisson:redisson:3.28.0' // https://cnblogs.com/keeya/p/13846807.html // https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter diff --git a/entity/build.gradle b/entity/build.gradle index 38e36a1..da748f4 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -10,6 +10,6 @@ dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api api 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.6' api 'org.springframework.boot:spring-boot-starter-validation' - api 'jakarta.annotation:jakarta.annotation-api:2.1.1' + api 'jakarta.annotation:jakarta.annotation-api:3.0.0-M1' } \ No newline at end of file -- Gitee From fdef870a7f49981cedb4e956936f26c2e309fdba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 6 May 2024 01:02:51 +0800 Subject: [PATCH 152/204] bump io.spring.dependency-management from 1.1.4 to 1.1.5 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 74ecbde..c51ecbf 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ buildscript { plugins { id 'java-library' // https://github.com/spring-gradle-plugins/dependency-management-plugin - id 'io.spring.dependency-management' version '1.1.4' + id 'io.spring.dependency-management' version '1.1.5' id 'idea' id "com.google.cloud.tools.jib" version "2.0.0" // https://github.com/graalvm/native-build-tools -- Gitee From 455bf885e3e69e722298bcc71c50820851b18c86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 6 May 2024 22:01:02 +0800 Subject: [PATCH 153/204] bump gradle from 8.5 to 8.74 --- gradle/wrapper/gradle-wrapper.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index d742d9a..c83ea3c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists #distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.3-bin.zip -distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.5-bin.zip +distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -- Gitee From cc5dfdc567a0dfb92871b6a0ee1126b83d979463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 7 May 2024 14:34:41 +0800 Subject: [PATCH 154/204] =?UTF-8?q?=E5=B8=A6=E4=B8=8A=E5=8F=82=E6=95=B0=20?= =?UTF-8?q?./gradlew=20bootRun=20-x=20test=20--args=3D'--spring.profiles.a?= =?UTF-8?q?ctive=3Dtest'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b0b1e1..ec4fe15 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

Eric-Dream

-=== + 本工程承担日常实验的作用,任何先行的尝试都在这里实践与落地。成熟的方案设计会在 [base-server](https://gitee.com/aohanhongzhi/springboot-base) 里面落地到生产。 @@ -158,6 +158,12 @@ https://spring.io/projects/spring-boot#support ./gradlew bootRun -x test ``` +带上参数 + +``` +./gradlew bootRun -x test --args='--spring.profiles.active=test' +``` + ```shell ./gradlew dependencyInsight --dependency mybatis ``` -- Gitee From e38ee10cbc884e698c959a25822beba994ff90d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 7 May 2024 15:19:33 +0800 Subject: [PATCH 155/204] jdk version --- app/src/main/resources/banner.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/resources/banner.txt b/app/src/main/resources/banner.txt index 9dfad75..eaae498 100644 --- a/app/src/main/resources/banner.txt +++ b/app/src/main/resources/banner.txt @@ -6,5 +6,5 @@ ____) | |____| | \ \ \ / | |____| | \ \ |_____/|______|_| \_\ \/ |______|_| \_\ -🚀 SpringBoot:${spring-boot.formatted-version} 😂 当前激活环境变量 ${spring.profiles.active} 端口 ${server.port} +🚀 SpringBoot:${spring-boot.formatted-version} 😂 当前激活环境变量 ${spring.profiles.active} 端口 ${server.port} JDK: ${java.version} -- Gitee From 899d3f6b72805070e301571e73e95c16d8e08743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 7 May 2024 17:23:12 +0800 Subject: [PATCH 156/204] git --- .gitignore | 5 ++++- .../dream/common/configuration/DataSourceConfigLoader.java | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 88ef259..32526de 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,7 @@ build/ **/out/ /app/src/main/resources/application-dev.yml class/ -bin/ \ No newline at end of file +bin/ +.classpath +.project +.settings/ \ No newline at end of file diff --git a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java index 67bed6b..2d9d4e2 100644 --- a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java +++ b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java @@ -48,6 +48,11 @@ public class DataSourceConfigLoader implements BeanPostProcessor, EnvironmentAwa String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); String password = jsonObject.get("spring.datasource.password").textValue(); + if (databaseUrl.contains("jdbc:p6spy:mysql")) { + systemProperties.put("spring.datasource.driver-class-name","com.p6spy.engine.spy.P6SpyDriver"); + }else { + systemProperties.put("spring.datasource.driver-class-name","com.mysql.cj.jdbc.Driver"); + } systemProperties.put("spring.datasource.url", databaseUrl); systemProperties.put("spring.datasource.username", databaseUsername); systemProperties.put("spring.datasource.password", password); -- Gitee From 4e2e04fe0b22f841ff0f5116c0707af8c99e1a36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 8 May 2024 11:57:08 +0800 Subject: [PATCH 157/204] format --- .../main/java/hxy/dream/app/Application.java | 22 ++-- .../dream/app/controller/AsyncController.java | 1 + .../ConcurrentHashMapController.java | 1 + .../app/controller/SystemController.java | 1 + .../dream/app/service/TransactionService.java | 123 +++++++++--------- .../hxy/dream/app/service/UserService.java | 10 +- .../app/service/impl/DonwloadServiceImpl.java | 2 +- .../app/service/impl/UserServiceImpl.java | 122 ++++++++--------- .../hxy/dream/entity/vo/BaseResponseVO.java | 93 ++++++------- 9 files changed, 188 insertions(+), 187 deletions(-) diff --git a/app/src/main/java/hxy/dream/app/Application.java b/app/src/main/java/hxy/dream/app/Application.java index b3597bd..daaf95e 100644 --- a/app/src/main/java/hxy/dream/app/Application.java +++ b/app/src/main/java/hxy/dream/app/Application.java @@ -1,6 +1,5 @@ package hxy.dream.app; - import org.mybatis.spring.annotation.MapperScan; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,24 +10,25 @@ import org.springframework.cglib.core.DebuggingClassWriter; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.scheduling.annotation.EnableAsync; - /** * @author iris */ -@SpringBootApplication(scanBasePackages = {"hxy.dream"}) +@SpringBootApplication(scanBasePackages = { "hxy.dream" }) @MapperScan("hxy.dream.dao.mapper") @ServletComponentScan("hxy.dream") @EnableAsync public class Application { - private static final Logger log = LoggerFactory.getLogger(Application.class); + private static final Logger log = LoggerFactory.getLogger(Application.class); - public static void main(String[] args) { - log.info("\n<============ \uD83D\uDE80 JAVA版本:{} CPU核心数:{} \uD83D\uDE80 ============>", System.getProperty("java.version"), Runtime.getRuntime().availableProcessors()); - System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "class"); - log.info("当前CPU核心={},{}是否为守护线程={}", Runtime.getRuntime().availableProcessors(), Thread.currentThread().getName(), Thread.currentThread().isDaemon()); - ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); - log.trace("方便打断点"); - } + public static void main(String[] args) { + log.info("\n<============ \uD83D\uDE80 JAVA版本:{} CPU核心数:{} \uD83D\uDE80 ============>", + System.getProperty("java.version"), Runtime.getRuntime().availableProcessors()); + System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "class"); + log.info("当前CPU核心={},{}是否为守护线程={}", Runtime.getRuntime().availableProcessors(), + Thread.currentThread().getName(), Thread.currentThread().isDaemon()); + ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); + log.trace("方便打断点 {}", context); + } } diff --git a/app/src/main/java/hxy/dream/app/controller/AsyncController.java b/app/src/main/java/hxy/dream/app/controller/AsyncController.java index 1ded250..bdeff35 100644 --- a/app/src/main/java/hxy/dream/app/controller/AsyncController.java +++ b/app/src/main/java/hxy/dream/app/controller/AsyncController.java @@ -24,6 +24,7 @@ import java.util.concurrent.TimeUnit; @RestController @RequestMapping("/async") public class AsyncController { + private static final Logger log = LoggerFactory.getLogger(AsyncController.class); /** diff --git a/app/src/main/java/hxy/dream/app/controller/ConcurrentHashMapController.java b/app/src/main/java/hxy/dream/app/controller/ConcurrentHashMapController.java index 7938619..996e7fc 100644 --- a/app/src/main/java/hxy/dream/app/controller/ConcurrentHashMapController.java +++ b/app/src/main/java/hxy/dream/app/controller/ConcurrentHashMapController.java @@ -60,6 +60,7 @@ public class ConcurrentHashMapController { }); + forkJoinPool.close(); //等待所有任务完成 forkJoinPool.shutdown(); forkJoinPool.awaitTermination(1, TimeUnit.HOURS); diff --git a/app/src/main/java/hxy/dream/app/controller/SystemController.java b/app/src/main/java/hxy/dream/app/controller/SystemController.java index f3982b0..f3882d3 100644 --- a/app/src/main/java/hxy/dream/app/controller/SystemController.java +++ b/app/src/main/java/hxy/dream/app/controller/SystemController.java @@ -16,6 +16,7 @@ import java.util.concurrent.TimeUnit; @Slf4j @RestController public class SystemController { + @GetMapping("/") public BaseResponseVO index() { diff --git a/app/src/main/java/hxy/dream/app/service/TransactionService.java b/app/src/main/java/hxy/dream/app/service/TransactionService.java index 1751653..1cacb72 100644 --- a/app/src/main/java/hxy/dream/app/service/TransactionService.java +++ b/app/src/main/java/hxy/dream/app/service/TransactionService.java @@ -1,6 +1,5 @@ package hxy.dream.app.service; - import hxy.dream.dao.mapper.UserMapper; import hxy.dream.dao.model.UserModel; import hxy.dream.entity.vo.BaseResponseVO; @@ -21,75 +20,73 @@ import jakarta.annotation.Resource; @Service public class TransactionService { - @Resource - private UserMapper userMapper; + @Resource + private UserMapper userMapper; - @Resource - private TransactionSubService transactionSubService; + @Resource + private TransactionSubService transactionSubService; - /** - * 测试事务 - */ - @Transactional(propagation = Propagation.REQUIRED) - public BaseResponseVO propagation() { - saveParent(); - try { - transactionSubService.saveChildren(); - } catch (Exception e) { - log.error("====>\n异常直接捕获,但是还会抛出事务异常", e); - } + /** + * 测试事务 + */ + @Transactional(propagation = Propagation.REQUIRED) + public BaseResponseVO propagation() { + saveParent(); + try { + transactionSubService.saveChildren(); + } catch (Exception e) { + log.error("====>\n异常直接捕获,但是还会抛出事务异常", e); + } // int a = 1 / 0; - log.info("====>\n事务测试运行完成了"); - return BaseResponseVO.success(); - } - - // ===========service实现类 - public void saveParent() { - UserModel stu = new UserModel(); - stu.setName("parent"); - stu.setAge(19); - userMapper.insert(stu); // 数据库插入一条parent记录 - } - + log.info("====>\n事务测试运行完成了"); + return BaseResponseVO.success(); + } - @Transactional(isolation = Isolation.READ_UNCOMMITTED) - public BaseResponseVO isolation() { - int id = 1; - UserModel userModel = userMapper.selectById(id); - log.info("\n=====>第一次查询信息{}", userModel); + // ===========service实现类 + public void saveParent() { + UserModel stu = new UserModel(); + stu.setName("parent"); + stu.setAge(19); + userMapper.insert(stu); // 数据库插入一条parent记录 + } - try { - Thread.sleep(6000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - // 这里读到别人未提交的数据,也就是脏数据 - userModel = userMapper.selectById(id); - log.info("\n=====>第二次查询信息{},是脏数据", userModel); - return BaseResponseVO.success(); - } + @Transactional(isolation = Isolation.READ_UNCOMMITTED) + public BaseResponseVO isolation() { + int id = 1; + UserModel userModel = userMapper.selectById(id); + log.info("\n=====>第一次查询信息{}", userModel); - @Transactional(isolation = Isolation.READ_UNCOMMITTED) - public BaseResponseVO isolation1() { - try { - Thread.sleep(3000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - UserModel userModel = new UserModel(); - userModel.setId(1); - userModel.setAge(9); - userMapper.updateById(userModel); - try { - Thread.sleep(6000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - // 发生异常回滚了 - int a = 1 / 0; + try { + Thread.sleep(6000); + } catch (InterruptedException e) { + log.error("{}", e.getMessage(), e); + } + // 这里读到别人未提交的数据,也就是脏数据 + userModel = userMapper.selectById(id); + log.info("\n=====>第二次查询信息{},是脏数据", userModel); + return BaseResponseVO.success(); + } - return BaseResponseVO.success(); - } + @Transactional(isolation = Isolation.READ_UNCOMMITTED) + public BaseResponseVO isolation1() { + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + log.error("{}", e.getMessage(), e); + } + UserModel userModel = new UserModel(); + userModel.setId(1); + userModel.setAge(9); + userMapper.updateById(userModel); + try { + Thread.sleep(6000); + } catch (InterruptedException e) { + log.error("{}", e.getMessage(), e); + } + // 发生异常回滚了 + int a = 1 / 0; + return BaseResponseVO.success(); + } } diff --git a/app/src/main/java/hxy/dream/app/service/UserService.java b/app/src/main/java/hxy/dream/app/service/UserService.java index 7089e46..21d9545 100644 --- a/app/src/main/java/hxy/dream/app/service/UserService.java +++ b/app/src/main/java/hxy/dream/app/service/UserService.java @@ -10,14 +10,14 @@ import java.util.List; @Service public interface UserService { - UserModel add(UserParam userParam); + UserModel add(UserParam userParam); - UserModel get(String id); + UserModel get(String id); - BaseResponseVO exist(String id); + BaseResponseVO exist(String id); - List list(); + List list(); - BaseResponseVO delete(Integer id); + BaseResponseVO delete(Integer id); } diff --git a/app/src/main/java/hxy/dream/app/service/impl/DonwloadServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/DonwloadServiceImpl.java index 88bfd44..6752906 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/DonwloadServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/DonwloadServiceImpl.java @@ -19,7 +19,7 @@ public class DonwloadServiceImpl implements DonwloadService { private String url = "https://typora.io/windows/typora-setup-x64.exe"; @Override - public BaseResponseVO multipleDonwload() { + public BaseResponseVO multipleDonwload() { System.out.println("程序开始了"); diff --git a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java index 13b2b74..69758b7 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java @@ -24,73 +24,73 @@ import java.util.List; @RequiredArgsConstructor public class UserServiceImpl implements UserService { - // @Resource 可以通过上面的 @RequiredArgsConstructor注解来生成构造器。需要final标记 - private final UserMapper userMapper; + // @Resource 可以通过上面的 @RequiredArgsConstructor注解来生成构造器。需要final标记 + private final UserMapper userMapper; - @Override - public UserModel add(UserParam userParam) { - UserModel userModel = new UserModel(); - userModel.setName(userParam.getName()); - GenderEnum gender = userParam.getGender(); - userModel.setGender(gender); - userModel.setAddress(userParam.getAddress()); - userModel.setAge(userParam.getAge()); - if (gender == GenderEnum.UNKNOWN) { - log.error("性别未知"); - } - int insert = userMapper.insert(userModel); - log.debug("\n====>插入影响行数:{}", insert); - return userModel; - } + @Override + public UserModel add(UserParam userParam) { + UserModel userModel = new UserModel(); + userModel.setName(userParam.getName()); + GenderEnum gender = userParam.getGender(); + userModel.setGender(gender); + userModel.setAddress(userParam.getAddress()); + userModel.setAge(userParam.getAge()); + if (gender == GenderEnum.UNKNOWN) { + log.error("性别未知"); + } + int insert = userMapper.insert(userModel); + log.debug("\n====>插入影响行数:{}", insert); + return userModel; + } - @Override - @Cacheable(value = "UserService#36000", key = "'getUser'+#id",unless="#result == null") - public UserModel get(String id) { - UserModel userModel = userMapper.selectById(id); - return userModel; - } + @Override + @Cacheable(value = "UserService#36000", key = "'getUser'+#id", unless = "#result == null") + public UserModel get(String id) { + UserModel userModel = userMapper.selectById(id); + return userModel; + } - @Override - public List list() { - return userMapper.selectList(null); - } + @Override + public List list() { + return userMapper.selectList(null); + } - @Override - public BaseResponseVO delete(Integer id) { - int i = userMapper.deleteById(id); - if (i > 0) { - return BaseResponseVO.success(); - } else { - return BaseResponseVO.error("删除失败"); - } - } + @Override + public BaseResponseVO delete(Integer id) { + int i = userMapper.deleteById(id); + if (i > 0) { + return BaseResponseVO.success(); + } else { + return BaseResponseVO.error("删除失败"); + } + } - /** - * 判断用户id存在否 - * - * @param id - * @return - */ - @Override - public BaseResponseVO exist(String id) { + /** + * 判断用户id存在否 + * + * @param id + * @return + */ + @Override + public BaseResponseVO exist(String id) { - // 方案1 ,聚簇索引 - QueryWrapper queryWrapper = new QueryWrapper<>(); - // 只查询id这一列 - queryWrapper.eq("id", id).select("id"); - UserModel userModel = userMapper.selectOne(queryWrapper); - if (userModel != null) { - log.info("用户存在{}", userModel); - } + // 方案1 ,聚簇索引 + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 只查询id这一列 + queryWrapper.eq("id", id).select("id"); + UserModel userModel = userMapper.selectOne(queryWrapper); + if (userModel != null) { + log.info("用户存在{}", userModel); + } - // 方案2 count计数 - QueryWrapper queryWrapper1 = new QueryWrapper<>(); - queryWrapper1.eq("id", id).select("id").last("limit 1"); - Long count = userMapper.selectCount(queryWrapper1); - if (count > 0) { - log.info("用户存在{}", count); - } + // 方案2 count计数 + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("id", id).select("id").last("limit 1"); + Long count = userMapper.selectCount(queryWrapper1); + if (count > 0) { + log.info("用户存在{}", count); + } - return BaseResponseVO.success(); - } + return BaseResponseVO.success(); + } } diff --git a/entity/src/main/java/hxy/dream/entity/vo/BaseResponseVO.java b/entity/src/main/java/hxy/dream/entity/vo/BaseResponseVO.java index 082221b..75ec78f 100644 --- a/entity/src/main/java/hxy/dream/entity/vo/BaseResponseVO.java +++ b/entity/src/main/java/hxy/dream/entity/vo/BaseResponseVO.java @@ -7,50 +7,51 @@ import java.io.Serializable; @Data public class BaseResponseVO implements Serializable { - Long timestamp = System.currentTimeMillis(); - String message; - T data; - Integer code; - String xid; - - public BaseResponseVO(Integer code, String message, T data) { - this.code = code; - this.message = message; - this.data = data; - } - - public static BaseResponseVO success() { - return new BaseResponseVO(200, "success", null); - } - - public static BaseResponseVO success(T data) { - return new BaseResponseVO(200, "success", data); - } - - public static BaseResponseVO success(String message, T data) { - return new BaseResponseVO(200, message, data); - } - - public static BaseResponseVO error(T data) { - return new BaseResponseVO(500, "error", data); - } - - public static BaseResponseVO error(String message, T data) { - return new BaseResponseVO(500, message, data); - } - - public static BaseResponseVO badrequest(String message, T data) { - return new BaseResponseVO(500, message, data); - } - - - /** - * 这个计划是由 spring-cloud-starter-sleuth 实现的。但是貌似spring-cloud-starter-sleuth没咋更新了,样例都是n年前的,还指向了zipkin。 - *

- * 所以计划可以尝试用tlog实现下。https://tlog.yomahub.com/ https://github.com/dromara/TLog - */ - public String getXid() { - String traceId = MDC.get("traceId"); - return traceId; - } + private static final long serialVersionUID = -7956701197932947718L; + private Long timestamp = System.currentTimeMillis(); + private String message; + private T data; + private Integer code; + private String xid; + + public BaseResponseVO(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public static BaseResponseVO success() { + return new BaseResponseVO(200, "success", null); + } + + public static BaseResponseVO success(T data) { + return new BaseResponseVO(200, "success", data); + } + + public static BaseResponseVO success(String message, T data) { + return new BaseResponseVO(200, message, data); + } + + public static BaseResponseVO error(T data) { + return new BaseResponseVO(500, "error", data); + } + + public static BaseResponseVO error(String message, T data) { + return new BaseResponseVO(500, message, data); + } + + public static BaseResponseVO badrequest(String message, T data) { + return new BaseResponseVO(500, message, data); + } + + /** + * 这个计划是由 spring-cloud-starter-sleuth + * 实现的。但是貌似spring-cloud-starter-sleuth没咋更新了,样例都是n年前的,还指向了zipkin。 + *

+ * 所以计划可以尝试用tlog实现下。https://tlog.yomahub.com/ https://github.com/dromara/TLog + */ + public String getXid() { + String traceId = MDC.get("traceId"); + return traceId; + } } -- Gitee From b4616c0de04b058aa34d2f2b6aea0d41240a8683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 8 May 2024 13:21:48 +0800 Subject: [PATCH 158/204] format --- .../common/extend/GlobalExceptionHandler.java | 286 ++++++------ .../dream/common/extend/ParameterRecord.java | 440 +++++++++--------- 2 files changed, 367 insertions(+), 359 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/extend/GlobalExceptionHandler.java b/common/src/main/java/hxy/dream/common/extend/GlobalExceptionHandler.java index b67549c..189dae8 100644 --- a/common/src/main/java/hxy/dream/common/extend/GlobalExceptionHandler.java +++ b/common/src/main/java/hxy/dream/common/extend/GlobalExceptionHandler.java @@ -33,8 +33,8 @@ import java.io.IOException; import java.util.Map; /** - * Description:全局异常处理,采用@RestControllerAdvice + @ExceptionHandler解决 - *
自定义异常处理类 + * Description:全局异常处理,采用@RestControllerAdvice + @ExceptionHandler解决
+ * 自定义异常处理类 * * @author eric */ @@ -42,146 +42,144 @@ import java.util.Map; @Slf4j public class GlobalExceptionHandler implements InitializingBean { - /** - * Hide exception field in the return object - * - * @return - */ - @Bean - @Profile("prod") - public ErrorAttributes errorAttributes() { - return new DefaultErrorAttributes() { - @Override - public Map getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) { - return super.getErrorAttributes(webRequest, ErrorAttributeOptions.defaults().excluding(ErrorAttributeOptions.Include.EXCEPTION)); - } - }; - } - - @ExceptionHandler(WebException.class) - public void handleCustomException(HttpServletResponse res, WebException ex) throws IOException { - // 这里可以设置status,但是还不能设置 status code - res.sendError(ex.getHttpStatus().value(), ex.getMessage()); - } - - - /** - * 参数校验异常捕获 包括各种自定义的参数异常 - * - * @param request - * @param e - * @param fsFileId - * @return - */ - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(ConstraintViolationException.class) - public BaseResponseVO constraintViolationExceptionHandler(HttpServletRequest request, ConstraintViolationException e) { - log.warn("\n====>{} Exception Message: {}", request.getRequestURI(), e.getMessage(), e); - return BaseResponseVO.error("参数错误", e.getMessage()); - } - - /** - * 处理异常的访问链接 - * - * @param e - * @param webRequest - * @return - */ - @ExceptionHandler(value = {NoHandlerFoundException.class}) - public ModelAndView noMappingHandler(Exception e, WebRequest webRequest) { - log.error("No mapping exception:{}", e.getMessage(), e); - ModelAndView modelAndView = new ModelAndView(new MappingJackson2JsonView()); - modelAndView.addObject("code", 404); - modelAndView.addObject("msg", "接口异常,详情查询服务端"); - modelAndView.addObject("data", e.getMessage()); - return modelAndView; - } - - /** - * 方法参数校验 - * https://blog.csdn.net/chengliqu4475/article/details/100834090 - */ - @ExceptionHandler(MethodArgumentNotValidException.class) - public BaseResponseVO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { - log.warn(e.getMessage(), e); - return BaseResponseVO.error("参数检验出错啦!", e.getBindingResult().getFieldError().getDefaultMessage()); - } - - - /** - * 处理400参数错误 - * - * @param e - * @return - */ - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(HttpMessageNotReadableException.class) - public BaseResponseVO handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { - log.warn("参数解析失败{}", e.getMessage(), e); - return BaseResponseVO.badrequest("参数解析失败", e.getMessage()); - } - - /** - * 405错误方法不支持 - * - * @param e - * @return - */ - @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) - @ExceptionHandler(HttpRequestMethodNotSupportedException.class) - public BaseResponseVO handleHttpRequestMethodNotSupportedException(HttpServletRequest request, HttpRequestMethodNotSupportedException e) { - log.warn("\n====>[{}]不支持当前[{}]请求方法,应该是[{},{}]", request.getRequestURI(), e.getMethod(), e.getSupportedHttpMethods(), e.getSupportedMethods(), e); - return BaseResponseVO.badrequest("请求方法不支持", e.getMessage()); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(MissingServletRequestParameterException.class) - public BaseResponseVO MissingServletRequestParameterException(MissingServletRequestParameterException e) { - log.warn("\n====>请求参数错误{}", e.getMessage(), e); - return BaseResponseVO.badrequest("请求参数错误", e.getMessage()); - } - - @ExceptionHandler(DuplicateKeyException.class) - public BaseResponseVO handleDuplicateKeyException(DuplicateKeyException e) { - log.warn("\n====>", e); - return BaseResponseVO.badrequest("请求参数错误", e.getMessage()); - - } - - /** - * 这个应该放在最下面比较好,最后加载 - * 处理未定义的其他异常信息 - * 参数为空等 - * - * @param request - * @param exception - * @return - */ - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(value = Exception.class) - public BaseResponseVO exceptionHandler(HttpServletRequest request, Exception exception) { - String message = "系统发生错误"; - log.error("当前URL={} ", request.getRequestURI(), exception); - - if (exception instanceof NullPointerException) { - message = "biu,踩雷啦!"; - } else if (exception instanceof ValidationException) { - message = "参数检验出错啦!"; - } else if (exception instanceof BaseException) { - message = "业务处理发生错误"; - } - - return BaseResponseVO.error(message, exception.getMessage()); - } - - @Override - public void afterPropertiesSet() throws Exception { - log.info("\n====>全局异常注入正常"); - } - - @PostConstruct - public void init() { - log.info("\n====>@PostConstruct 全局异常注入正常"); - } + /** + * Hide exception field in the return object + * + * @return + */ + @Bean + @Profile("prod") + public ErrorAttributes errorAttributes() { + return new DefaultErrorAttributes() { + @Override + public Map getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) { + return super.getErrorAttributes(webRequest, + ErrorAttributeOptions.defaults().excluding(ErrorAttributeOptions.Include.EXCEPTION)); + } + }; + } + + @ExceptionHandler(WebException.class) + public void handleCustomException(HttpServletResponse res, WebException ex) throws IOException { + // 这里可以设置status,但是还不能设置 status code + res.sendError(ex.getHttpStatus().value(), ex.getMessage()); + } + + /** + * 参数校验异常捕获 包括各种自定义的参数异常 + * + * @param request + * @param e + * @param fsFileId + * @return + */ + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(ConstraintViolationException.class) + public BaseResponseVO constraintViolationExceptionHandler(HttpServletRequest request, + ConstraintViolationException e) { + log.warn("\n====>{} Exception Message: {}", request.getRequestURI(), e.getMessage(), e); + return BaseResponseVO.error("参数错误", e.getMessage()); + } + + /** + * 处理异常的访问链接 + * + * @param e + * @param webRequest + * @return + */ + @ExceptionHandler(value = { NoHandlerFoundException.class }) + public ModelAndView noMappingHandler(Exception e, WebRequest webRequest) { + log.error("No mapping exception:{}", e.getMessage(), e); + ModelAndView modelAndView = new ModelAndView(new MappingJackson2JsonView()); + modelAndView.addObject("code", 404); + modelAndView.addObject("msg", "接口异常,详情查询服务端"); + modelAndView.addObject("data", e.getMessage()); + return modelAndView; + } + + /** + * 方法参数校验 https://blog.csdn.net/chengliqu4475/article/details/100834090 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public BaseResponseVO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + log.warn("{}", e.getMessage(), e); + return BaseResponseVO.error("参数检验出错啦!", e.getBindingResult().getFieldError().getDefaultMessage()); + } + + /** + * 处理400参数错误 + * + * @param e + * @return + */ + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMessageNotReadableException.class) + public BaseResponseVO handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + log.warn("参数解析失败{}", e.getMessage(), e); + return BaseResponseVO.badrequest("参数解析失败", e.getMessage()); + } + + /** + * 405错误方法不支持 + * + * @param e + * @return + */ + @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public BaseResponseVO handleHttpRequestMethodNotSupportedException(HttpServletRequest request, + HttpRequestMethodNotSupportedException e) { + log.warn("\n====>[{}]不支持当前[{}]请求方法,应该是[{},{}]", request.getRequestURI(), e.getMethod(), + e.getSupportedHttpMethods(), e.getSupportedMethods(), e); + return BaseResponseVO.badrequest("请求方法不支持", e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MissingServletRequestParameterException.class) + public BaseResponseVO MissingServletRequestParameterException(MissingServletRequestParameterException e) { + log.warn("\n====>请求参数错误{}", e.getMessage(), e); + return BaseResponseVO.badrequest("请求参数错误", e.getMessage()); + } + + @ExceptionHandler(DuplicateKeyException.class) + public BaseResponseVO handleDuplicateKeyException(DuplicateKeyException e) { + log.warn("\n====>", e); + return BaseResponseVO.badrequest("请求参数错误", e.getMessage()); + + } + + /** + * 这个应该放在最下面比较好,最后加载 处理未定义的其他异常信息 参数为空等 + * + * @param request + * @param exception + * @return + */ + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(value = Exception.class) + public BaseResponseVO exceptionHandler(HttpServletRequest request, Exception exception) { + String message = "系统发生错误"; + log.error("当前URL={} ", request.getRequestURI(), exception); + + if (exception instanceof NullPointerException) { + message = "biu,踩雷啦!"; + } else if (exception instanceof ValidationException) { + message = "参数检验出错啦!"; + } else if (exception instanceof BaseException) { + message = "业务处理发生错误"; + } + + return BaseResponseVO.error(message, exception.getMessage()); + } + + @Override + public void afterPropertiesSet() throws Exception { + log.info("\n====>全局异常注入正常"); + } + + @PostConstruct + public void init() { + log.info("\n====>@PostConstruct 全局异常注入正常"); + } } - diff --git a/common/src/main/java/hxy/dream/common/extend/ParameterRecord.java b/common/src/main/java/hxy/dream/common/extend/ParameterRecord.java index a4f021a..ac3f23c 100644 --- a/common/src/main/java/hxy/dream/common/extend/ParameterRecord.java +++ b/common/src/main/java/hxy/dream/common/extend/ParameterRecord.java @@ -32,7 +32,6 @@ import java.io.InputStream; import java.lang.reflect.Method; import java.util.Map; - /** * 请求信息,参数记录,时间 * @@ -43,224 +42,235 @@ import java.util.Map; @Order(1) public class ParameterRecord { - private static final Logger log = LoggerFactory.getLogger("parameter"); - - private final int timeLength = 150; - private final int dataLength = 250; - private final int paramLength = 1000; - - String[] ignoreUrl = new String[]{"actuator"}; - - ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class); - - @Around("execution(* hxy.dream.*.controller.*.*(..))") - public Object processTx(ProceedingJoinPoint jp) throws Throwable { - String ip = null, url = null, requestURI = null, targetMethod = null, params = null, resultJson = null, requestMethod = null, ipAddr = null; - long timeConsuming = 0; - long start = System.currentTimeMillis(); - - try { - ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if (requestAttributes == null) { - return null; - } - HttpServletRequest request = requestAttributes.getRequest(); - ipAddr = IPAddress.getIpAddr(request); - requestMethod = request.getMethod(); - requestURI = request.getRequestURI(); - final StringBuffer requestURL = request.getRequestURL(); - - final Signature signature1 = jp.getSignature(); - if (signature1 != null && signature1 instanceof MethodSignature) { - MethodSignature signature = (MethodSignature) signature1; - Method method = signature.getMethod(); - Class targetClass = method.getDeclaringClass(); - //拼接请求的接口名 end - url = getUrl(targetClass, method); - - String name = signature.getName(); - - //接口对应的方法名 - targetMethod = targetClass.getSimpleName() + "." + method.getName() + "()"; - } - - boolean contains = false; - for (String a : ignoreUrl) { - contains = url.contains(a); - if (contains) { - break; - } - } - - - final Map parameterMap = request.getParameterMap(); - - if (parameterMap.size() == 0) { - BufferedReader reader = null; - try { - reader = request.getReader(); - String str, wholeStr = ""; - while ((str = reader.readLine()) != null) { - wholeStr += str; - } - if (StringUtils.isNotEmpty(wholeStr)) { - params = wholeStr; - } - } catch (IOException e1) { - log.error("{}", e1.getMessage(), e1); - } - } else { - params = objectMapper.writeValueAsString(parameterMap); + private static final Logger log = LoggerFactory.getLogger("parameter"); + + private final int timeLength = 150; + private final int dataLength = 250; + private final int paramLength = 1000; + + String[] ignoreUrl = new String[] { "actuator" }; + + ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class); + + @Around("execution(* hxy.dream.*.controller.*.*(..))") + public Object processTx(ProceedingJoinPoint jp) throws Throwable { + String ip = null, url = null, requestURI = null, targetMethod = null, params = null, resultJson = null, + requestMethod = null, ipAddr = null; + long timeConsuming = 0; + long start = System.currentTimeMillis(); + + try { + ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder + .getRequestAttributes(); + if (requestAttributes == null) { + return null; + } + HttpServletRequest request = requestAttributes.getRequest(); + ipAddr = IPAddress.getIpAddr(request); + requestMethod = request.getMethod(); + requestURI = request.getRequestURI(); + final StringBuffer requestURL = request.getRequestURL(); + log.debug(requestURI); + + final Signature signature1 = jp.getSignature(); + if (signature1 != null && signature1 instanceof MethodSignature) { + MethodSignature signature = (MethodSignature) signature1; + Method method = signature.getMethod(); + Class targetClass = method.getDeclaringClass(); + // 拼接请求的接口名 end + url = getUrl(targetClass, method); + + String name = signature.getName(); + + // 接口对应的方法名 + targetMethod = targetClass.getSimpleName() + "." + method.getName() + "()"; + } + + boolean contains = false; + for (String a : ignoreUrl) { + if (url != null) { + contains = url.contains(a); + if (contains) { + break; + } + } else { + break; + } + } + + final Map parameterMap = request.getParameterMap(); + + if (parameterMap.size() == 0) { + BufferedReader reader = null; + try { + reader = request.getReader(); + String str, wholeStr = ""; + while ((str = reader.readLine()) != null) { + wholeStr += str; + } + if (StringUtils.isNotEmpty(wholeStr)) { + params = wholeStr; + } + } catch (IOException e1) { + log.error("{}", e1.getMessage(), e1); + } + } else { + params = objectMapper.writeValueAsString(parameterMap); // 参数记录的目的就是为了数据恢复,所以这里无论多大的参数都要记录下来! // if (params.length() > paramLength) { // params = params.substring(0, paramLength) + "....eg...."; // } - } - - ip = request.getRemoteHost(); - - if (jp != null) { - boolean paramsExist = true; - Object[] args = jp.getArgs(); - for (Object object : args) { - if (object == null) { - paramsExist = false; - } - } - SourceLocation sourceLocation = jp.getSourceLocation(); - - // 这里会抛出Controller的业务异常 - Object result = jp.proceed(); - if (result != null) { - resultJson = objectMapper.writeValueAsString(result); - - timeConsuming = System.currentTimeMillis() - start; - - if (resultJson.length() > dataLength) { - resultJson = resultJson.substring(0, dataLength) + "....略...."; - } - if (url != null && !contains) { - - if (timeConsuming > timeLength) { - log.warn("\n\n====> visitor host ip :{}\n====> url : {} uri : {} \n====>method:{}\n====>parameter:{}\n====>response:{}\n====>耗时较长:{}ms", ipAddr + " 代理:" + ip, requestMethod + " " + url, requestURI, targetMethod, params, resultJson, timeConsuming); - } else { - log.info("\n\n====> visitor host ip :{}\n====> url : {} uri : {} \n====>method:{}\n====>parameter:{}\n====>response:{}\n====>耗时:{}ms", ipAddr + " 代理:" + ip, requestMethod + " " + url, requestURI, targetMethod, params, resultJson, timeConsuming); - } - } - return result; - } - - } - - } catch (Throwable throwable) { + } + + ip = request.getRemoteHost(); + + if (jp != null) { + boolean paramsExist = true; + Object[] args = jp.getArgs(); + for (Object object : args) { + if (object == null) { + paramsExist = false; + } + } + SourceLocation sourceLocation = jp.getSourceLocation(); + + // 这里会抛出Controller的业务异常 + Object result = jp.proceed(); + if (result != null) { + resultJson = objectMapper.writeValueAsString(result); + + timeConsuming = System.currentTimeMillis() - start; + + if (resultJson.length() > dataLength) { + resultJson = resultJson.substring(0, dataLength) + "....略...."; + } + if (url != null && !contains) { + + if (timeConsuming > timeLength) { + log.warn("\n\n====> visitor host ip :{}\n====> url : {} uri : {} \n====>method:{}\n====>parameter:{}\n====>response:{}\n====>耗时较长:{}ms", + ipAddr + " 代理:" + ip, requestMethod + " " + url, requestURI, targetMethod, params, + resultJson, timeConsuming); + } else { + log.info("\n\n====> visitor host ip :{}\n====> url : {} uri : {} \n====>method:{}\n====>parameter:{}\n====>response:{}\n====>耗时:{}ms", + ipAddr + " 代理:" + ip, requestMethod + " " + url, requestURI, targetMethod, params, + resultJson, timeConsuming); + } + } + return result; + } + + } + + } catch (Throwable throwable) { // 这里会捕获Controller里面的业务异常直接返回 - timeConsuming = System.currentTimeMillis() - start; - log.info("\n\n====> visitor host ip : {}\n====> url : {} uri : {} \n====> method : {}\n====> parameter : {}\n====> exception : {}\n====> 耗时 : {}ms", ipAddr + " 代理:" + ip, requestMethod + " " + url, requestURI, targetMethod, params, throwable.getMessage(), timeConsuming); - // 异常继续抛出,交由全局异常捕获再处理 - throw throwable; - } - - return null; - } - - private String getUrl(Class targetClass, Method method) { - //拼接请求的接口名 start - StringBuilder requestMapping = new StringBuilder(); - - RequestMapping mapping = targetClass.getAnnotation(RequestMapping.class); - if (mapping != null) { - String[] value = mapping.value(); - if (value.length > 0) { - requestMapping.append(value[0]); - } - } - - mapping = method.getAnnotation(RequestMapping.class); - if (mapping != null) { - String[] value = mapping.value(); - if (value.length > 0) { - requestMapping.append(value[0]); - } else { - String[] path = mapping.path(); - if (path.length > 0) { - requestMapping.append(path[0]); - } - } - } else { - PostMapping postMapping = method.getAnnotation(PostMapping.class); - if (postMapping != null) { - String[] value = postMapping.value(); - if (value.length > 0) { - requestMapping.append(value[0]); - } else { - String[] path = postMapping.path(); - if (path.length > 0) { - requestMapping.append(path[0]); - } - } - } else { - GetMapping getMapping = method.getAnnotation(GetMapping.class); - if (getMapping != null) { - String[] value = getMapping.value(); - if (value.length > 0) { - requestMapping.append(value[0]); - } else { - String[] path = getMapping.path(); - if (path.length > 0) { - requestMapping.append(path[0]); - } - } - } else { - DeleteMapping deleteMapping = method.getAnnotation(DeleteMapping.class); - if (deleteMapping != null) { - String[] value = deleteMapping.value(); - if (value.length > 0) { - requestMapping.append(value[0]); - } else { - String[] path = deleteMapping.path(); - if (path.length > 0) { - requestMapping.append(path[0]); - } - } - } else { - PutMapping putMapping = method.getAnnotation(PutMapping.class); - if (putMapping != null) { - String[] value = putMapping.value(); - if (value.length > 0) { - requestMapping.append(value[0]); - } else { - String[] path = putMapping.path(); - if (path.length > 0) { - requestMapping.append(path[0]); - } - } - } - } - } - } - } - - return requestMapping.toString(); - - } - - - /** - * Description: 复制输入流
- */ - public static InputStream cloneInputStream(ServletInputStream inputStream) { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - byte[] buffer = new byte[1024]; - int len; - try { - while ((len = inputStream.read(buffer)) > -1) { - byteArrayOutputStream.write(buffer, 0, len); - } - byteArrayOutputStream.flush(); - } catch (IOException e) { - log.error("复制输入流错误{}", e.getMessage(), e); - } - return new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); - } + timeConsuming = System.currentTimeMillis() - start; + log.info("\n\n====> visitor host ip : {}\n====> url : {} uri : {} \n====> method : {}\n====> parameter : {}\n====> exception : {}\n====> 耗时 : {}ms", + ipAddr + " 代理:" + ip, requestMethod + " " + url, requestURI, targetMethod, params, + throwable.getMessage(), timeConsuming); + // 异常继续抛出,交由全局异常捕获再处理 + throw throwable; + } + + return null; + } + + private String getUrl(Class targetClass, Method method) { + // 拼接请求的接口名 start + StringBuilder requestMapping = new StringBuilder(); + + RequestMapping mapping = targetClass.getAnnotation(RequestMapping.class); + if (mapping != null) { + String[] value = mapping.value(); + if (value.length > 0) { + requestMapping.append(value[0]); + } + } + + mapping = method.getAnnotation(RequestMapping.class); + if (mapping != null) { + String[] value = mapping.value(); + if (value.length > 0) { + requestMapping.append(value[0]); + } else { + String[] path = mapping.path(); + if (path.length > 0) { + requestMapping.append(path[0]); + } + } + } else { + PostMapping postMapping = method.getAnnotation(PostMapping.class); + if (postMapping != null) { + String[] value = postMapping.value(); + if (value.length > 0) { + requestMapping.append(value[0]); + } else { + String[] path = postMapping.path(); + if (path.length > 0) { + requestMapping.append(path[0]); + } + } + } else { + GetMapping getMapping = method.getAnnotation(GetMapping.class); + if (getMapping != null) { + String[] value = getMapping.value(); + if (value.length > 0) { + requestMapping.append(value[0]); + } else { + String[] path = getMapping.path(); + if (path.length > 0) { + requestMapping.append(path[0]); + } + } + } else { + DeleteMapping deleteMapping = method.getAnnotation(DeleteMapping.class); + if (deleteMapping != null) { + String[] value = deleteMapping.value(); + if (value.length > 0) { + requestMapping.append(value[0]); + } else { + String[] path = deleteMapping.path(); + if (path.length > 0) { + requestMapping.append(path[0]); + } + } + } else { + PutMapping putMapping = method.getAnnotation(PutMapping.class); + if (putMapping != null) { + String[] value = putMapping.value(); + if (value.length > 0) { + requestMapping.append(value[0]); + } else { + String[] path = putMapping.path(); + if (path.length > 0) { + requestMapping.append(path[0]); + } + } + } + } + } + } + } + + return requestMapping.toString(); + + } + + /** + * Description: 复制输入流
+ */ + public static InputStream cloneInputStream(ServletInputStream inputStream) { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len; + try { + while ((len = inputStream.read(buffer)) > -1) { + byteArrayOutputStream.write(buffer, 0, len); + } + byteArrayOutputStream.flush(); + } catch (IOException e) { + log.error("复制输入流错误{}", e.getMessage(), e); + } + return new ByteArrayInputStream(byteArrayOutputStream.toByteArray()); + } } -- Gitee From 422f77b1f599771552ae20b5c0628383cf2acbbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 8 May 2024 16:25:23 +0800 Subject: [PATCH 159/204] 1 --- .../src/main/java/hxy/dream/entity/exception/WebException.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/entity/src/main/java/hxy/dream/entity/exception/WebException.java b/entity/src/main/java/hxy/dream/entity/exception/WebException.java index a591014..549cb6a 100644 --- a/entity/src/main/java/hxy/dream/entity/exception/WebException.java +++ b/entity/src/main/java/hxy/dream/entity/exception/WebException.java @@ -10,7 +10,8 @@ import org.springframework.http.HttpStatus; */ public class WebException extends BaseException { - private HttpStatus httpStatus; + private static final long serialVersionUID = -2175679614507721010L; + private HttpStatus httpStatus; private String message; public WebException(String message, HttpStatus httpStatus) { -- Gitee From e6b7cf2efce86cc8d9bc6c2e513e469a44ccf10e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 26 May 2024 19:05:22 +0800 Subject: [PATCH 160/204] bump springBootVersion from 3.2.5 to 3.3.0 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c51ecbf..f91934d 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.2.5' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.3.0' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() -- Gitee From d2609fccd081ec50233f9429fd4965a3b2162579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 26 May 2024 19:55:38 +0800 Subject: [PATCH 161/204] bump springBootVersion from 3.2.5 to 3.3.0 --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index f91934d..1c6059b 100644 --- a/build.gradle +++ b/build.gradle @@ -149,9 +149,9 @@ subprojects { implementation 'p6spy:p6spy:3.9.1' implementation 'commons-io:commons-io:2.15.0' - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2' - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.15.2' // Java 8 Datatypes - implementation 'com.fasterxml.jackson:jackson-bom:2.15.2' // Java 8 Datatypes + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8' // Java 8 Datatypes + implementation 'com.fasterxml.jackson:jackson-bom' // Java 8 Datatypes compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' -- Gitee From f7cd4cad6dac13619e00e301de8aaa39fb0dc472 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 30 May 2024 12:05:16 +0800 Subject: [PATCH 162/204] =?UTF-8?q?bean=E6=B3=A8=E5=85=A5=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/extend/GlobalExceptionHandler.java | 284 +++++++++--------- 1 file changed, 144 insertions(+), 140 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/extend/GlobalExceptionHandler.java b/common/src/main/java/hxy/dream/common/extend/GlobalExceptionHandler.java index 189dae8..057c28b 100644 --- a/common/src/main/java/hxy/dream/common/extend/GlobalExceptionHandler.java +++ b/common/src/main/java/hxy/dream/common/extend/GlobalExceptionHandler.java @@ -29,6 +29,7 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.ConstraintViolationException; import jakarta.validation.ValidationException; + import java.io.IOException; import java.util.Map; @@ -42,144 +43,147 @@ import java.util.Map; @Slf4j public class GlobalExceptionHandler implements InitializingBean { - /** - * Hide exception field in the return object - * - * @return - */ - @Bean - @Profile("prod") - public ErrorAttributes errorAttributes() { - return new DefaultErrorAttributes() { - @Override - public Map getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) { - return super.getErrorAttributes(webRequest, - ErrorAttributeOptions.defaults().excluding(ErrorAttributeOptions.Include.EXCEPTION)); - } - }; - } - - @ExceptionHandler(WebException.class) - public void handleCustomException(HttpServletResponse res, WebException ex) throws IOException { - // 这里可以设置status,但是还不能设置 status code - res.sendError(ex.getHttpStatus().value(), ex.getMessage()); - } - - /** - * 参数校验异常捕获 包括各种自定义的参数异常 - * - * @param request - * @param e - * @param fsFileId - * @return - */ - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(ConstraintViolationException.class) - public BaseResponseVO constraintViolationExceptionHandler(HttpServletRequest request, - ConstraintViolationException e) { - log.warn("\n====>{} Exception Message: {}", request.getRequestURI(), e.getMessage(), e); - return BaseResponseVO.error("参数错误", e.getMessage()); - } - - /** - * 处理异常的访问链接 - * - * @param e - * @param webRequest - * @return - */ - @ExceptionHandler(value = { NoHandlerFoundException.class }) - public ModelAndView noMappingHandler(Exception e, WebRequest webRequest) { - log.error("No mapping exception:{}", e.getMessage(), e); - ModelAndView modelAndView = new ModelAndView(new MappingJackson2JsonView()); - modelAndView.addObject("code", 404); - modelAndView.addObject("msg", "接口异常,详情查询服务端"); - modelAndView.addObject("data", e.getMessage()); - return modelAndView; - } - - /** - * 方法参数校验 https://blog.csdn.net/chengliqu4475/article/details/100834090 - */ - @ExceptionHandler(MethodArgumentNotValidException.class) - public BaseResponseVO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { - log.warn("{}", e.getMessage(), e); - return BaseResponseVO.error("参数检验出错啦!", e.getBindingResult().getFieldError().getDefaultMessage()); - } - - /** - * 处理400参数错误 - * - * @param e - * @return - */ - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(HttpMessageNotReadableException.class) - public BaseResponseVO handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { - log.warn("参数解析失败{}", e.getMessage(), e); - return BaseResponseVO.badrequest("参数解析失败", e.getMessage()); - } - - /** - * 405错误方法不支持 - * - * @param e - * @return - */ - @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) - @ExceptionHandler(HttpRequestMethodNotSupportedException.class) - public BaseResponseVO handleHttpRequestMethodNotSupportedException(HttpServletRequest request, - HttpRequestMethodNotSupportedException e) { - log.warn("\n====>[{}]不支持当前[{}]请求方法,应该是[{},{}]", request.getRequestURI(), e.getMethod(), - e.getSupportedHttpMethods(), e.getSupportedMethods(), e); - return BaseResponseVO.badrequest("请求方法不支持", e.getMessage()); - } - - @ResponseStatus(HttpStatus.BAD_REQUEST) - @ExceptionHandler(MissingServletRequestParameterException.class) - public BaseResponseVO MissingServletRequestParameterException(MissingServletRequestParameterException e) { - log.warn("\n====>请求参数错误{}", e.getMessage(), e); - return BaseResponseVO.badrequest("请求参数错误", e.getMessage()); - } - - @ExceptionHandler(DuplicateKeyException.class) - public BaseResponseVO handleDuplicateKeyException(DuplicateKeyException e) { - log.warn("\n====>", e); - return BaseResponseVO.badrequest("请求参数错误", e.getMessage()); - - } - - /** - * 这个应该放在最下面比较好,最后加载 处理未定义的其他异常信息 参数为空等 - * - * @param request - * @param exception - * @return - */ - @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) - @ExceptionHandler(value = Exception.class) - public BaseResponseVO exceptionHandler(HttpServletRequest request, Exception exception) { - String message = "系统发生错误"; - log.error("当前URL={} ", request.getRequestURI(), exception); - - if (exception instanceof NullPointerException) { - message = "biu,踩雷啦!"; - } else if (exception instanceof ValidationException) { - message = "参数检验出错啦!"; - } else if (exception instanceof BaseException) { - message = "业务处理发生错误"; - } - - return BaseResponseVO.error(message, exception.getMessage()); - } - - @Override - public void afterPropertiesSet() throws Exception { - log.info("\n====>全局异常注入正常"); - } - - @PostConstruct - public void init() { - log.info("\n====>@PostConstruct 全局异常注入正常"); - } + /** + * Hide exception field in the return object + * + * @return + */ + @Bean + @Profile("prod") + public ErrorAttributes errorAttributes() { + return new DefaultErrorAttributes() { + @Override + public Map getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) { + return super.getErrorAttributes(webRequest, + ErrorAttributeOptions.defaults().excluding(ErrorAttributeOptions.Include.EXCEPTION)); + } + }; + } + + @ExceptionHandler(WebException.class) + public void handleCustomException(HttpServletResponse res, WebException ex) throws IOException { + // 这里可以设置status,但是还不能设置 status code + res.sendError(ex.getHttpStatus().value(), ex.getMessage()); + } + + /** + * 参数校验异常捕获 包括各种自定义的参数异常 + * + * @param request + * @param e + * @param fsFileId + * @return + */ + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(ConstraintViolationException.class) + public BaseResponseVO constraintViolationExceptionHandler(HttpServletRequest request, + ConstraintViolationException e) { + log.warn("\n====>{} Exception Message: {}", request.getRequestURI(), e.getMessage(), e); + return BaseResponseVO.error("参数错误", e.getMessage()); + } + + /** + * 处理异常的访问链接 + * + * @param e + * @param webRequest + * @return + */ + @ExceptionHandler(value = {NoHandlerFoundException.class}) + public ModelAndView noMappingHandler(Exception e, WebRequest webRequest) { + log.error("No mapping exception:{}", e.getMessage(), e); + ModelAndView modelAndView = new ModelAndView(new MappingJackson2JsonView()); + modelAndView.addObject("code", 404); + modelAndView.addObject("msg", "接口异常,详情查询服务端"); + modelAndView.addObject("data", e.getMessage()); + return modelAndView; + } + + /** + * 方法参数校验 https://blog.csdn.net/chengliqu4475/article/details/100834090 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public BaseResponseVO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + log.warn("{}", e.getMessage(), e); + return BaseResponseVO.error("参数检验出错啦!", e.getBindingResult().getFieldError().getDefaultMessage()); + } + + /** + * 处理400参数错误 + * + * @param e + * @return + */ + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(HttpMessageNotReadableException.class) + public BaseResponseVO handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + log.warn("参数解析失败{}", e.getMessage(), e); + return BaseResponseVO.badrequest("参数解析失败", e.getMessage()); + } + + /** + * 405错误方法不支持 + * + * @param e + * @return + */ + @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED) + @ExceptionHandler(HttpRequestMethodNotSupportedException.class) + public BaseResponseVO handleHttpRequestMethodNotSupportedException(HttpServletRequest request, + HttpRequestMethodNotSupportedException e) { + log.warn("\n====>[{}]不支持当前[{}]请求方法,应该是[{},{}]", request.getRequestURI(), e.getMethod(), + e.getSupportedHttpMethods(), e.getSupportedMethods(), e); + return BaseResponseVO.badrequest("请求方法不支持", e.getMessage()); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MissingServletRequestParameterException.class) + public BaseResponseVO MissingServletRequestParameterException(MissingServletRequestParameterException e) { + log.warn("\n====>请求参数错误{}", e.getMessage(), e); + return BaseResponseVO.badrequest("请求参数错误", e.getMessage()); + } + + @ExceptionHandler(DuplicateKeyException.class) + public BaseResponseVO handleDuplicateKeyException(DuplicateKeyException e) { + log.warn("\n====>", e); + return BaseResponseVO.badrequest("请求参数错误", e.getMessage()); + + } + + /** + * 这个应该放在最下面比较好,最后加载 处理未定义的其他异常信息 参数为空等 + * + * @param request + * @param exception + * @return + */ + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + @ExceptionHandler(value = Exception.class) + public BaseResponseVO exceptionHandler(HttpServletRequest request, Exception exception) { + String message = "系统发生错误"; + log.error("当前URL={} ", request.getRequestURI(), exception); + + if (exception instanceof NullPointerException) { + message = "biu,踩雷啦!"; + } else if (exception instanceof ValidationException) { + message = "参数检验出错啦!"; + } else if (exception instanceof BaseException) { + message = "业务处理发生错误"; + } + + return BaseResponseVO.error(message, exception.getMessage()); + } + + @Override + public void afterPropertiesSet() throws Exception { + log.info("\n====>全局异常注入正常"); + } + + /** + * bean注入初始化 + */ + @PostConstruct + public void init() { + log.info("\n====>@PostConstruct 全局异常注入正常"); + } } -- Gitee From f2f60ed82361ee27739620f0234913100b7d9b5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 6 Jun 2024 21:28:10 +0800 Subject: [PATCH 163/204] gradle proxy --- asset/gradle-proxy-image/init.gradle | 37 ++++++++++++++++++++++ asset/gradle-proxy-image/init.gradle.kts | 39 ++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 asset/gradle-proxy-image/init.gradle create mode 100644 asset/gradle-proxy-image/init.gradle.kts diff --git a/asset/gradle-proxy-image/init.gradle b/asset/gradle-proxy-image/init.gradle new file mode 100644 index 0000000..dd7592d --- /dev/null +++ b/asset/gradle-proxy-image/init.gradle @@ -0,0 +1,37 @@ +def urlMappings = [ + "https://repo.maven.apache.org/maven2" : "https://mirrors.tencent.com/nexus/repository/maven-public/", + "https://dl.google.com/dl/android/maven2": "https://mirrors.tencent.com/nexus/repository/maven-public/", + "https://plugins.gradle.org/m2" : "https://mirrors.tencent.com/nexus/repository/gradle-plugins/" +] + +def enableMirror = { + all { repo -> + if (repo instanceof MavenArtifactRepository) { + def originalUrl = repo.url.toString().replaceAll("/\$", "") + def mirrorUrl = urlMappings[originalUrl] + if (mirrorUrl) { + logger.lifecycle("Repository[${repo.url}] is mirrored to $mirrorUrl") + repo.setUrl(mirrorUrl) + } + } + } +} + +gradle.allprojects { + buildscript { + repositories.configure(enableMirror) + } + repositories.configure(enableMirror) +} + +gradle.beforeSettings { settings -> + settings.pluginManagement.repositories.configure(enableMirror) + // 6.8 及更高版本执行 DependencyResolutionManagement 配置 + if (gradle.gradleVersion >= "6.8") { + def drm = settings.dependencyResolutionManagement + drm.repositories.configure(enableMirror) + println("Gradle ${gradle.gradleVersion} DependencyResolutionManagement Configured $settings") + } else { + println("Gradle ${gradle.gradleVersion} DependencyResolutionManagement Ignored $settings") + } +} diff --git a/asset/gradle-proxy-image/init.gradle.kts b/asset/gradle-proxy-image/init.gradle.kts new file mode 100644 index 0000000..071ac37 --- /dev/null +++ b/asset/gradle-proxy-image/init.gradle.kts @@ -0,0 +1,39 @@ +fun RepositoryHandler.enableMirror() { + all { + if (this is MavenArtifactRepository) { + val originalUrl = this.url.toString().removeSuffix("/") + urlMappings[originalUrl]?.let { + logger.lifecycle("Repository[$url] is mirrored to $it") + this.setUrl(it) + } + } + } +} + +val urlMappings = mapOf( + "https://repo.maven.apache.org/maven2" to "https://mirrors.tencent.com/nexus/repository/maven-public/", + "https://dl.google.com/dl/android/maven2" to "https://mirrors.tencent.com/nexus/repository/maven-public/", + "https://plugins.gradle.org/m2" to "https://mirrors.tencent.com/nexus/repository/gradle-plugins/" +) + +gradle.allprojects { + buildscript { + repositories.enableMirror() + } + repositories.enableMirror() +} + +gradle.beforeSettings { + pluginManagement.repositories.enableMirror() + // 6.8 及更高版本执行 DependencyResolutionManagement 配置 + if (gradle.gradleVersion >= "6.8") { + val getDrm = settings.javaClass.getDeclaredMethod("getDependencyResolutionManagement") + val drm = getDrm.invoke(settings) + val getRepos = drm.javaClass.getDeclaredMethod("getRepositories") + val repos = getRepos.invoke(drm) as RepositoryHandler + repos.enableMirror() + println("Gradle ${gradle.gradleVersion} DependencyResolutionManagement Configured $settings") + } else { + println("Gradle ${gradle.gradleVersion} DependencyResolutionManagement Ignored $settings") + } +} \ No newline at end of file -- Gitee From b97ba4f53aebea803e4b756630aa1a40cfc1371e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 11 Jun 2024 11:08:18 +0800 Subject: [PATCH 164/204] optimize --- .../dream/common/converter/StringToDateConverterFactory.java | 2 -- .../src/main/java/hxy/dream/entity/exception/BaseException.java | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/converter/StringToDateConverterFactory.java b/common/src/main/java/hxy/dream/common/converter/StringToDateConverterFactory.java index e33cd4c..485b8af 100644 --- a/common/src/main/java/hxy/dream/common/converter/StringToDateConverterFactory.java +++ b/common/src/main/java/hxy/dream/common/converter/StringToDateConverterFactory.java @@ -9,8 +9,6 @@ public class StringToDateConverterFactory implements ConverterFactory Converter getConverter(Class targetType) { - - return new StringToDateConverter(); } } diff --git a/entity/src/main/java/hxy/dream/entity/exception/BaseException.java b/entity/src/main/java/hxy/dream/entity/exception/BaseException.java index 159c5bb..b0fde3c 100644 --- a/entity/src/main/java/hxy/dream/entity/exception/BaseException.java +++ b/entity/src/main/java/hxy/dream/entity/exception/BaseException.java @@ -11,6 +11,7 @@ import lombok.EqualsAndHashCode; @EqualsAndHashCode(callSuper = false) public class BaseException extends RuntimeException { + private static final long serialVersionUID = 8548698263350114411L; private String message; private int code = 0; -- Gitee From 61f79c402e941e873cb3389d9edac5db7330ff85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 11 Jun 2024 14:39:41 +0800 Subject: [PATCH 165/204] =?UTF-8?q?=E6=B5=8B=E8=AF=95Mapper.insertOrUpdate?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/hxy/dream/dao/mapper/UserMapperTest.java | 11 +++++++++++ entity/build.gradle | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java index ab38cff..6a12dd2 100644 --- a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java +++ b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java @@ -21,6 +21,17 @@ public class UserMapperTest extends BaseTest { @Resource UserMapper userMapper; + + @Test + public void testInsertOrUpdateSetNull() { + UserModel userModel = new UserModel(); + userModel.setId(1); + userModel.setAge(231); + boolean update = userMapper.insertOrUpdate(userModel); + log.info("Updated user{}", update); + } + + @Test public void testUpdateNull() { diff --git a/entity/build.gradle b/entity/build.gradle index da748f4..fc0385f 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,7 +8,7 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.6' + api 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.7' api 'org.springframework.boot:spring-boot-starter-validation' api 'jakarta.annotation:jakarta.annotation-api:3.0.0-M1' -- Gitee From 5272177fb9ebf092cf1d8dea6ae6d8d58da91357 Mon Sep 17 00:00:00 2001 From: HouXiaoyi Date: Sun, 16 Jun 2024 23:34:35 +0800 Subject: [PATCH 166/204] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E6=B1=A0=E4=B8=8EJDK=E5=8A=A8=E6=80=81=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E7=A0=94=E7=A9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dream/dao/PooledDataSourceCloseTest.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 app/src/test/java/hxy/dream/dao/PooledDataSourceCloseTest.java diff --git a/app/src/test/java/hxy/dream/dao/PooledDataSourceCloseTest.java b/app/src/test/java/hxy/dream/dao/PooledDataSourceCloseTest.java new file mode 100644 index 0000000..a2f5d73 --- /dev/null +++ b/app/src/test/java/hxy/dream/dao/PooledDataSourceCloseTest.java @@ -0,0 +1,32 @@ +package hxy.dream.dao; + +import org.apache.ibatis.datasource.pooled.PooledDataSource; +import org.junit.jupiter.api.Test; + + +import java.sql.Connection; + +/** + * @author HOX4SGH + * @description + * @date 2024/6/16 + */ +public class PooledDataSourceCloseTest { + + @Test + public void testPooledDataSourceClose() throws Exception { + PooledDataSource pds = new PooledDataSource(); + pds.setDriver("com.mysql.cj.jdbc.Driver"); + pds.setUrl("jdbc:mysql://.217.230.42:3306/test"); + pds.setUsername("test"); + pds.setPassword("Newp0ss,2024!"); + + while (true) { + Connection connection = pds.getConnection(); + System.out.println(connection); + Thread.sleep(1000); + connection.close(); + } + } + +} -- Gitee From 5a72f29794c83bdd02a94b2ceb8cd1c95fef439e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 19 Jun 2024 13:27:45 +0800 Subject: [PATCH 167/204] =?UTF-8?q?=E6=9C=80=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E7=9A=84IDEA2024.2=20=E5=B7=B2=E7=BB=8F=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BA=86=E7=83=AD=E5=8A=A0=E8=BD=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ec4fe15..feb0e45 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ https://www.azul.com/ ### 热加载技术 +**最新版本的IDEA2024.2 已经默认支持了热加载。** + 这个针对的是[Jetbrains Runtime](https://github.com/JetBrains/JetBrainsRuntime/releases) ,所以其他JDK慎重。实际测试jdk17 21都可以正常运行。 https://github.com/HotswapProjects/HotswapAgent @@ -49,8 +51,6 @@ https://github.com/HotswapProjects/HotswapAgent 修改代码后,Build -> Rebuild Project (Ctrl + Shift + F9) 重新编译和加载修改的类文件即可生效。 -> http://blog.houxiaoyi.cn/#/src/Java/%E7%83%AD%E5%8A%A0%E8%BD%BD - ### 执行初始化的sql语句 有两种方案。一种借助与mybatis-plus 另一种就是mybatis的 @@ -302,7 +302,7 @@ https://blog.csdn.net/bandancer/article/details/84926383 [关于springboot中添加Filter的方法](https://www.jianshu.com/p/3d421fbce734) -### +### ``` WARN at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive (PoolBase.java:184) - HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@63ec6a5a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -- Gitee From 08eee9420fcaf91884e81bae6c383d284267742a Mon Sep 17 00:00:00 2001 From: aohanhongzhi Date: Fri, 21 Jun 2024 12:46:30 +0800 Subject: [PATCH 168/204] bump springboot from 3.3.0 to 3.3.1 --- build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 1c6059b..b43c6b8 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.3.0' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.3.1' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c83ea3c..73c30fb 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists #distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.3-bin.zip -distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.7-bin.zip +distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.8-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -- Gitee From 1319a2d8d7c5edda9bf20545e675bfc6b06925f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 21 Jun 2024 22:37:42 +0800 Subject: [PATCH 169/204] database.json --- asset/database.json | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 asset/database.json diff --git a/asset/database.json b/asset/database.json new file mode 100644 index 0000000..e636293 --- /dev/null +++ b/asset/database.json @@ -0,0 +1,7 @@ +{ + "spring.datasource.password":"Newp0ss,2024!", + "spring.datasource.url":"jdbc:mysql://139.217.230.42:3306/test?useUnicode=true&serverTimezone=GMT%2b8&characterEncoding=UTF-8", + "spring.datasource.p6spyurl":"jdbc:p6spy:mysql://139.217.230.42:3306/test?useUnicode=true&serverTimezone=GMT%2b8&characterEncoding=UTF-8", + "spring.datasource.username":"test", + "spring.r2dbc.url":"r2dbc:mysql://139.217.230.42:3306/test?serverTimezone=GMT&characterEncoding=UTF-8" +} -- Gitee From 7f980122ebecfba329a278094d3e7fcfb735a3c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 23 Jun 2024 12:56:07 +0800 Subject: [PATCH 170/204] SpringBoot --- SpringBoot.md | 15 +++++++++++++++ SpringBootAutoConfig.md | 3 --- 2 files changed, 15 insertions(+), 3 deletions(-) create mode 100644 SpringBoot.md delete mode 100644 SpringBootAutoConfig.md diff --git a/SpringBoot.md b/SpringBoot.md new file mode 100644 index 0000000..db19255 --- /dev/null +++ b/SpringBoot.md @@ -0,0 +1,15 @@ +SpringBoot +=== + +[面试官:SpringBoot如何实现缓存预热?](https://mp.weixin.qq.com/s/6h6IGjBp3hYduXIcE-coYA) + +# SpringBoot AutoConfig + +SpringBoot的 自动装配看这个类就可以了 ConfigurationClassPostProcessor + +### SpringBoot 启动而执行。 + +1. 使用ApplicationListener启动监听事件实现缓存预热。 +2. 使用 @PostConstruct 注解实现缓存预热。 +3. 使用 CommandLineRunner 或 ApplicationRunner 实现缓存预热。 +4. 通过实现 InitializingBean 接口,并重写 afterPropertiesSet 方法实现缓存预热。 \ No newline at end of file diff --git a/SpringBootAutoConfig.md b/SpringBootAutoConfig.md deleted file mode 100644 index 7bb493b..0000000 --- a/SpringBootAutoConfig.md +++ /dev/null @@ -1,3 +0,0 @@ -SpringBoot AutoConfig -=== -SpringBoot的 自动装配看这个类就可以了 ConfigurationClassPostProcessor -- Gitee From 59277d82779cd7c0f1f84ef1d3fa5ab911a4cba1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 24 Jun 2024 11:06:49 +0800 Subject: [PATCH 171/204] =?UTF-8?q?=E6=9B=B4=E6=96=B0mp=20url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- TRANSACTION.md | 4 ++-- app/src/main/resources/application-test.yml | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index feb0e45..d8d47cf 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ https\://services.gradle.org/distributions/gradle-7.4-bin.zip Gradle | 项目构建工具 | [https://gradle.com/](https://gradle.com/) Spring Security | 认证和授权框架 | [https://spring.io/projects/spring-security](https://spring.io/projects/spring-security) MyBatis | ORM框架 | [http://www.mybatis.org/mybatis-3/zh/index.html](http://www.mybatis.org/mybatis-3/zh/index.html) - MyBatisPlus | ORM框架补充 | [https://mybatis.plus/](https://mybatis.plus/) + MyBatisPlus | ORM框架补充 | [https://baomidou.com/](https://baomidou.com/) MyBatisGenerator | 数据层代码生成 | [http://www.mybatis.org/generator/index.html](http://www.mybatis.org/generator/index.html) Swagger-UI | 文档生产工具 | [https://github.com/swagger-api/swagger-ui](https://github.com/swagger-api/swagger-ui) Hibernator-Validator | 验证框架 | [http://hibernate.org/validator/](http://hibernate.org/validator/) diff --git a/TRANSACTION.md b/TRANSACTION.md index 379f083..5ab05ec 100644 --- a/TRANSACTION.md +++ b/TRANSACTION.md @@ -75,8 +75,8 @@ Spring的事务五大隔离机制与数据库也是一一对应的,就是多 [Spring事务隔离级别与数据库隔离级别不一致时,该以谁为准?](https://blog.csdn.net/weixin_44259720/article/details/112826960) -上面这个在实践的时候,第一次未成功复现,原因是因为mybatis的一级缓存,导致同一个事务的第二次查询压根没有实际执行,而是读取了第一次的缓存。 -只要禁用了 +上面这个在实践的时候,第一次未成功复现,原因是因为mybatis的一级缓存(需要禁用,才可以),导致同一个事务的第二次查询压根没有实际执行,而是读取了第一次的缓存。 + ```shell ==> Preparing: SELECT id,name,age,gender,password,create_time,update_time,deleted FROM user_model WHERE id=? AND deleted=0 diff --git a/app/src/main/resources/application-test.yml b/app/src/main/resources/application-test.yml index 55bceb7..fa202c2 100755 --- a/app/src/main/resources/application-test.yml +++ b/app/src/main/resources/application-test.yml @@ -48,6 +48,7 @@ logging: hxy.dream: debug com.fasterxml.jackson: debug com.baomidou.mybatisplus: debug + org.apache.ibatis: debug mybatis-plus: configuration: -- Gitee From 650b5636d34c966010b245a6ec096c006d063ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 24 Jun 2024 11:48:57 +0800 Subject: [PATCH 172/204] =?UTF-8?q?=E5=8A=A0=E5=85=A5mapper=20=20xml?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/resources/mapper/UserMapper.xml | 13 +++++++++++++ .../java/hxy/dream/dao/mapper/UserMapperTest.java | 8 ++++++++ .../main/java/hxy/dream/dao/mapper/UserMapper.java | 9 +++++++++ 3 files changed, 30 insertions(+) create mode 100644 app/src/main/resources/mapper/UserMapper.xml diff --git a/app/src/main/resources/mapper/UserMapper.xml b/app/src/main/resources/mapper/UserMapper.xml new file mode 100644 index 0000000..81de2cc --- /dev/null +++ b/app/src/main/resources/mapper/UserMapper.xml @@ -0,0 +1,13 @@ + + + + + update user_model + set name = #{name}, + age = #{age}, + deleted = 0 + where id = #{id} + + diff --git a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java index 6a12dd2..3b4fa31 100644 --- a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java +++ b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java @@ -60,5 +60,13 @@ public class UserMapperTest extends BaseTest { } + @Test + public void deleteWithoutLogicDelete() { + UserModel userModel = new UserModel(); + userModel.setId(1); + userModel.setAge(2); + userModel.setName("222"); + userMapper.updateWithoutLogicDelete(userModel); + } } diff --git a/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java b/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java index 61985dc..fc305bb 100644 --- a/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java +++ b/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java @@ -7,4 +7,13 @@ import hxy.dream.dao.model.UserModel; * @author iris */ public interface UserMapper extends BaseMapper { + + /** + * 忽略逻辑删除,只能写SQL语句 + * + * @param userModel + * @return + */ + int updateWithoutLogicDelete(UserModel userModel); + } -- Gitee From b1a9382e501f1c8bce1b452921bcff3bd95e3b13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 24 Jun 2024 12:47:06 +0800 Subject: [PATCH 173/204] =?UTF-8?q?pure=20mybatis=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dream/dao/mybatis/PureMybatisTest.java | 63 +++++++++++++++++++ app/src/test/resources/mybatis-config.xml | 20 ++++++ 2 files changed, 83 insertions(+) create mode 100644 app/src/test/java/hxy/dream/dao/mybatis/PureMybatisTest.java create mode 100644 app/src/test/resources/mybatis-config.xml diff --git a/app/src/test/java/hxy/dream/dao/mybatis/PureMybatisTest.java b/app/src/test/java/hxy/dream/dao/mybatis/PureMybatisTest.java new file mode 100644 index 0000000..e4965bb --- /dev/null +++ b/app/src/test/java/hxy/dream/dao/mybatis/PureMybatisTest.java @@ -0,0 +1,63 @@ +package hxy.dream.dao.mybatis; + +import hxy.dream.dao.mapper.UserMapper; +import hxy.dream.dao.model.UserModel; +import org.apache.ibatis.io.Resources; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.Reader; +import java.util.Arrays; + +/** + * @author eric + * @description + * @date 2024/6/24 + */ +public class PureMybatisTest { + + private static final Logger log = LoggerFactory.getLogger(PureMybatisTest.class); + + + static SqlSessionFactory sqlSessionFactory; + + @BeforeAll + public static void beforeAll() { + String resource = "mybatis-config.xml"; + try (Reader reader = Resources.getResourceAsReader(resource)) { + sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Test + public void insertMultipleUsers2() { + UserModel userModel = new UserModel(); + userModel.setId(1); + userModel.setAge(111); + + UserModel userModel1 = new UserModel(); + userModel1.setId(2); + userModel1.setAge(222); + + + try (SqlSession session = sqlSessionFactory.openSession()) { + UserMapper userMapper = session.getMapper(UserMapper.class); +// 同一个session,没有提交就是在同一个Transaction里面 + for (UserModel user : Arrays.asList(userModel, userModel1)) { + int i = userMapper.updateWithoutLogicDelete(user); + log.info("Updated {}", i); + } + session.commit(); // 提交事务 + } catch (Exception e) { + e.printStackTrace(); + } + // session 会自动close + } +} diff --git a/app/src/test/resources/mybatis-config.xml b/app/src/test/resources/mybatis-config.xml new file mode 100644 index 0000000..1d9cf7b --- /dev/null +++ b/app/src/test/resources/mybatis-config.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + -- Gitee From 29ede1d8a2d7bf2c4dda4e39fcfd968c233ab3b1 Mon Sep 17 00:00:00 2001 From: aohanhongzhi Date: Wed, 26 Jun 2024 13:17:22 +0800 Subject: [PATCH 174/204] =?UTF-8?q?Controller=E5=B1=82=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dream/app/controller/UserController.java | 10 +- .../app/service/impl/UserServiceImpl.java | 122 +++++++++--------- .../dream/contoller/LongControllerTest.java | 36 ++++++ .../dream/contoller/SystemControllerTest.java | 30 +++++ .../dream/contoller/UserControllerTest.java | 42 ++++++ build.gradle | 2 + .../configuration/DataSourceConfigLoader.java | 34 ++--- .../RemoteEnvironmentPostProcessor.java | 16 ++- .../hxy/dream/entity/vo/BaseResponseVO.java | 99 +++++++------- 9 files changed, 255 insertions(+), 136 deletions(-) create mode 100644 app/src/test/java/hxy/dream/contoller/LongControllerTest.java create mode 100644 app/src/test/java/hxy/dream/contoller/SystemControllerTest.java create mode 100644 app/src/test/java/hxy/dream/contoller/UserControllerTest.java diff --git a/app/src/main/java/hxy/dream/app/controller/UserController.java b/app/src/main/java/hxy/dream/app/controller/UserController.java index 08f6a54..27f99d0 100644 --- a/app/src/main/java/hxy/dream/app/controller/UserController.java +++ b/app/src/main/java/hxy/dream/app/controller/UserController.java @@ -10,14 +10,9 @@ import hxy.dream.entity.dto.OtherInfo; import hxy.dream.entity.vo.BaseResponseVO; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import jakarta.validation.Valid; @@ -72,6 +67,7 @@ public class UserController { * @see BaseEnumDeserializer */ @PostMapping("add/body") + @ResponseStatus(HttpStatus.CREATED) public BaseResponseVO saveBody(@Valid @RequestBody UserParam userParam) { log.debug("\n====>当前添加的用户信息是{}", userParam); UserModel userModel = userService.add(userParam); diff --git a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java index 69758b7..9134878 100644 --- a/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java +++ b/app/src/main/java/hxy/dream/app/service/impl/UserServiceImpl.java @@ -24,73 +24,73 @@ import java.util.List; @RequiredArgsConstructor public class UserServiceImpl implements UserService { - // @Resource 可以通过上面的 @RequiredArgsConstructor注解来生成构造器。需要final标记 - private final UserMapper userMapper; + // @Resource 可以通过上面的 @RequiredArgsConstructor注解来生成构造器。需要final标记 + private final UserMapper userMapper; - @Override - public UserModel add(UserParam userParam) { - UserModel userModel = new UserModel(); - userModel.setName(userParam.getName()); - GenderEnum gender = userParam.getGender(); - userModel.setGender(gender); - userModel.setAddress(userParam.getAddress()); - userModel.setAge(userParam.getAge()); - if (gender == GenderEnum.UNKNOWN) { - log.error("性别未知"); - } - int insert = userMapper.insert(userModel); - log.debug("\n====>插入影响行数:{}", insert); - return userModel; - } + @Override + public UserModel add(UserParam userParam) { + UserModel userModel = new UserModel(); + userModel.setName(userParam.getName()); + GenderEnum gender = userParam.getGender(); + userModel.setGender(gender); + userModel.setAddress(userParam.getAddress()); + userModel.setAge(userParam.getAge()); + if (gender == GenderEnum.UNKNOWN) { + log.error("性别未知"); + } + int insert = userMapper.insert(userModel); + log.debug("\n====>插入影响行数:{}", insert); + return userModel; + } - @Override - @Cacheable(value = "UserService#36000", key = "'getUser'+#id", unless = "#result == null") - public UserModel get(String id) { - UserModel userModel = userMapper.selectById(id); - return userModel; - } + @Override + @Cacheable(value = "UserService#36000", key = "'getUser'+#id", unless = "#result == null") + public UserModel get(String id) { + UserModel userModel = userMapper.selectById(id); + return userModel; + } - @Override - public List list() { - return userMapper.selectList(null); - } + @Override + public List list() { + return userMapper.selectList(null); + } - @Override - public BaseResponseVO delete(Integer id) { - int i = userMapper.deleteById(id); - if (i > 0) { - return BaseResponseVO.success(); - } else { - return BaseResponseVO.error("删除失败"); - } - } + @Override + public BaseResponseVO delete(Integer id) { + int i = userMapper.deleteById(id); + if (i > 0) { + return BaseResponseVO.success(); + } else { + return BaseResponseVO.error("删除失败"); + } + } - /** - * 判断用户id存在否 - * - * @param id - * @return - */ - @Override - public BaseResponseVO exist(String id) { + /** + * 判断用户id存在否 + * + * @param id + * @return + */ + @Override + public BaseResponseVO exist(String id) { - // 方案1 ,聚簇索引 - QueryWrapper queryWrapper = new QueryWrapper<>(); - // 只查询id这一列 - queryWrapper.eq("id", id).select("id"); - UserModel userModel = userMapper.selectOne(queryWrapper); - if (userModel != null) { - log.info("用户存在{}", userModel); - } + // 方案1 ,聚簇索引 + QueryWrapper queryWrapper = new QueryWrapper<>(); + // 只查询id这一列 + queryWrapper.eq("id", id).select("id"); + UserModel userModel = userMapper.selectOne(queryWrapper); + if (userModel != null) { + log.info("用户存在{}", userModel); + } - // 方案2 count计数 - QueryWrapper queryWrapper1 = new QueryWrapper<>(); - queryWrapper1.eq("id", id).select("id").last("limit 1"); - Long count = userMapper.selectCount(queryWrapper1); - if (count > 0) { - log.info("用户存在{}", count); - } + // 方案2 count计数 + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.eq("id", id).select("id").last("limit 1"); + Long count = userMapper.selectCount(queryWrapper1); + if (count > 0) { + log.info("用户存在{}", count); + } - return BaseResponseVO.success(); - } + return BaseResponseVO.success(); + } } diff --git a/app/src/test/java/hxy/dream/contoller/LongControllerTest.java b/app/src/test/java/hxy/dream/contoller/LongControllerTest.java new file mode 100644 index 0000000..f365988 --- /dev/null +++ b/app/src/test/java/hxy/dream/contoller/LongControllerTest.java @@ -0,0 +1,36 @@ +package hxy.dream.contoller; + + +import hxy.dream.app.Application; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@ActiveProfiles("test") +@AutoConfigureMockMvc +@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class LongControllerTest { + + @Autowired + private MockMvc mockMvc; + + + @Test + public void testLongController() throws Exception { + mockMvc.perform(get("/long")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.message").value("success")) + .andExpect(jsonPath("$.data").exists()) + .andDo(MockMvcResultHandlers.print()); + } + +} diff --git a/app/src/test/java/hxy/dream/contoller/SystemControllerTest.java b/app/src/test/java/hxy/dream/contoller/SystemControllerTest.java new file mode 100644 index 0000000..ef6a29c --- /dev/null +++ b/app/src/test/java/hxy/dream/contoller/SystemControllerTest.java @@ -0,0 +1,30 @@ +package hxy.dream.contoller; + +import hxy.dream.BaseTest; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.result.MockMvcResultHandlers; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@AutoConfigureMockMvc +public class SystemControllerTest extends BaseTest { + + @Autowired + private MockMvc mockMvc; + + @Test + public void testIndex() throws Exception { + mockMvc.perform(get("/")) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.code").value(200)) + .andExpect(jsonPath("$.message").value("success")) + .andExpect(jsonPath("$.data").exists()) + .andDo(MockMvcResultHandlers.print()); + } + +} diff --git a/app/src/test/java/hxy/dream/contoller/UserControllerTest.java b/app/src/test/java/hxy/dream/contoller/UserControllerTest.java new file mode 100644 index 0000000..207c6e6 --- /dev/null +++ b/app/src/test/java/hxy/dream/contoller/UserControllerTest.java @@ -0,0 +1,42 @@ +package hxy.dream.contoller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import hxy.dream.BaseTest; +import hxy.dream.dao.model.UserModel; +import hxy.dream.entity.enums.GenderEnum; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@AutoConfigureMockMvc +public class UserControllerTest extends BaseTest { + + @Autowired + private MockMvc mvc; + + @Test + public void testUserAdd() throws Exception { + + UserModel stu = new UserModel(); + stu.setName("parent"); + stu.setAge(19); + stu.setGender(GenderEnum.BOY); + + ObjectMapper objectMapper = new ObjectMapper(); + String s = objectMapper.writeValueAsString(stu); + + mvc.perform(post("/user/add/body") + .content(s) // 提交body参数 + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(MockMvcResultMatchers.jsonPath("$.data").exists()); + } + +} diff --git a/build.gradle b/build.gradle index b43c6b8..2389e78 100644 --- a/build.gradle +++ b/build.gradle @@ -143,6 +143,8 @@ subprojects { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-webflux' testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'com.squareup.okio:okio:3.2.0' // 解决mock启动错误 + implementation 'org.springframework.data:spring-data-redis' implementation 'com.zaxxer:HikariCP:5.1.0' diff --git a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java index 2d9d4e2..9542855 100644 --- a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java +++ b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java @@ -44,23 +44,27 @@ public class DataSourceConfigLoader implements BeanPostProcessor, EnvironmentAwa ObjectMapper objectMapper = new ObjectMapper(); try { JsonNode jsonObject = objectMapper.readTree(new File(database)); + if (!jsonObject.isEmpty()) { + String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); + String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); + String password = jsonObject.get("spring.datasource.password").textValue(); + if (databaseUrl.contains("jdbc:p6spy:mysql")) { + systemProperties.put("spring.datasource.driver-class-name", "com.p6spy.engine.spy.P6SpyDriver"); + } else { + systemProperties.put("spring.datasource.driver-class-name", "com.mysql.cj.jdbc.Driver"); + } + systemProperties.put("spring.datasource.url", databaseUrl); + systemProperties.put("spring.datasource.username", databaseUsername); + systemProperties.put("spring.datasource.password", password); - String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); - String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); - String password = jsonObject.get("spring.datasource.password").textValue(); - if (databaseUrl.contains("jdbc:p6spy:mysql")) { - systemProperties.put("spring.datasource.driver-class-name","com.p6spy.engine.spy.P6SpyDriver"); - }else { - systemProperties.put("spring.datasource.driver-class-name","com.mysql.cj.jdbc.Driver"); - } - systemProperties.put("spring.datasource.url", databaseUrl); - systemProperties.put("spring.datasource.username", databaseUsername); - systemProperties.put("spring.datasource.password", password); + String r2dbcDatabaseUrl = jsonObject.get("spring.r2dbc.url").textValue(); + systemProperties.put("spring.r2dbc.url", r2dbcDatabaseUrl); + systemProperties.put("spring.r2dbc.username", databaseUsername); + systemProperties.put("spring.r2dbc.password", password); + } else { + log.error("没有数据库配置文件 {}", database); + } - String r2dbcDatabaseUrl = jsonObject.get("spring.r2dbc.url").textValue(); - systemProperties.put("spring.r2dbc.url", r2dbcDatabaseUrl); - systemProperties.put("spring.r2dbc.username", databaseUsername); - systemProperties.put("spring.r2dbc.password", password); } catch (JsonProcessingException e) { log.error("{}", e.getMessage(), e); } catch (IOException e) { diff --git a/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java b/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java index 14559f6..6408558 100644 --- a/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java +++ b/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java @@ -47,12 +47,16 @@ public class RemoteEnvironmentPostProcessor implements EnvironmentPostProcessor ObjectMapper objectMapper = new ObjectMapper(); try { JsonNode jsonObject = objectMapper.readTree(new File(database)); - String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); - String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); - String password = jsonObject.get("spring.datasource.password").textValue(); - properties.put("spring.datasource.url", databaseUrl); - properties.put("spring.datasource.username", databaseUsername); - properties.put("spring.datasource.password", password); + if (!jsonObject.isEmpty()) { + String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); + String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); + String password = jsonObject.get("spring.datasource.password").textValue(); + properties.put("spring.datasource.url", databaseUrl); + properties.put("spring.datasource.username", databaseUsername); + properties.put("spring.datasource.password", password); + } else { + log.error("没有数据库配置文件{}", database); + } } catch (JsonProcessingException e) { log.error("{}", e.getMessage(), e); } catch (IOException e) { diff --git a/entity/src/main/java/hxy/dream/entity/vo/BaseResponseVO.java b/entity/src/main/java/hxy/dream/entity/vo/BaseResponseVO.java index 75ec78f..457b14b 100644 --- a/entity/src/main/java/hxy/dream/entity/vo/BaseResponseVO.java +++ b/entity/src/main/java/hxy/dream/entity/vo/BaseResponseVO.java @@ -2,56 +2,61 @@ package hxy.dream.entity.vo; import lombok.Data; import org.slf4j.MDC; +import org.springframework.http.HttpStatus; import java.io.Serializable; @Data public class BaseResponseVO implements Serializable { - private static final long serialVersionUID = -7956701197932947718L; - private Long timestamp = System.currentTimeMillis(); - private String message; - private T data; - private Integer code; - private String xid; - - public BaseResponseVO(Integer code, String message, T data) { - this.code = code; - this.message = message; - this.data = data; - } - - public static BaseResponseVO success() { - return new BaseResponseVO(200, "success", null); - } - - public static BaseResponseVO success(T data) { - return new BaseResponseVO(200, "success", data); - } - - public static BaseResponseVO success(String message, T data) { - return new BaseResponseVO(200, message, data); - } - - public static BaseResponseVO error(T data) { - return new BaseResponseVO(500, "error", data); - } - - public static BaseResponseVO error(String message, T data) { - return new BaseResponseVO(500, message, data); - } - - public static BaseResponseVO badrequest(String message, T data) { - return new BaseResponseVO(500, message, data); - } - - /** - * 这个计划是由 spring-cloud-starter-sleuth - * 实现的。但是貌似spring-cloud-starter-sleuth没咋更新了,样例都是n年前的,还指向了zipkin。 - *

- * 所以计划可以尝试用tlog实现下。https://tlog.yomahub.com/ https://github.com/dromara/TLog - */ - public String getXid() { - String traceId = MDC.get("traceId"); - return traceId; - } + private static final long serialVersionUID = -7956701197932947718L; + private Long timestamp = System.currentTimeMillis(); + private String message; + private T data; + private Integer code; + private String xid; + + public BaseResponseVO(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public static BaseResponseVO success() { + return new BaseResponseVO(200, "success", null); + } + + public static BaseResponseVO success(T data) { + return new BaseResponseVO(200, "success", data); + } + + public static BaseResponseVO success(HttpStatus httpStatus, T data) { + return new BaseResponseVO(httpStatus.value(), "success", data); + } + + public static BaseResponseVO success(String message, T data) { + return new BaseResponseVO(200, message, data); + } + + public static BaseResponseVO error(T data) { + return new BaseResponseVO(500, "error", data); + } + + public static BaseResponseVO error(String message, T data) { + return new BaseResponseVO(500, message, data); + } + + public static BaseResponseVO badrequest(String message, T data) { + return new BaseResponseVO(500, message, data); + } + + /** + * 这个计划是由 spring-cloud-starter-sleuth + * 实现的。但是貌似spring-cloud-starter-sleuth没咋更新了,样例都是n年前的,还指向了zipkin。 + *

+ * 所以计划可以尝试用tlog实现下。https://tlog.yomahub.com/ https://github.com/dromara/TLog + */ + public String getXid() { + String traceId = MDC.get("traceId"); + return traceId; + } } -- Gitee From 1ce293f7e20e3e179b2741acf3c1996f220dab39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 30 Jun 2024 20:53:32 +0800 Subject: [PATCH 175/204] mybatis --- Mybatis.md | 38 ++++++++++++++++++++++++ README.md | 85 +++++++++++++++++++----------------------------------- 2 files changed, 67 insertions(+), 56 deletions(-) create mode 100644 Mybatis.md diff --git a/Mybatis.md b/Mybatis.md new file mode 100644 index 0000000..34ca5ee --- /dev/null +++ b/Mybatis.md @@ -0,0 +1,38 @@ + +### 执行初始化的sql语句 + +有两种方案。一种借助与mybatis-plus 另一种就是mybatis的 + +#### 基于mybatis的sql执行方案 + +[hxy.dream.common.init.ApplicationStartupRunner](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) + +#### 基于mybatis-plus的sql执行方案 + +##### 基于mybatis-plus配置直接执行 + +https://www.baomidou.com/pages/226c21/#%E9%85%8D%E7%BD%AE + +```yaml +# DataSource Config +spring: + datasource: + driver-class-name: org.h2.Driver + username: root + password: test + sql: + init: + schema-locations: classpath:db/schema-h2.sql + data-locations: classpath:db/data-h2.sql +``` + +##### 基于mybatis-plus的sql执行方案 + +[hxy.dream.common.init.MysqlDdl](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) + +### OpenFeign要退出历史舞台了 + +推荐 RestTemplate或者WebClient + +WebClient 声明式的API调用: +[RemoteApiConfig](common/src/main/java/hxy/dream/common/configuration/RemoteApiConfig.java) \ No newline at end of file diff --git a/README.md b/README.md index d8d47cf..496a9a5 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,12 @@ 敏感信息从程序外配置文件读取 | [RemoteEnvironmentPostProcessor.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FRemoteEnvironmentPostProcessor.java) 极海的方案 [DataSourceConfigLoader.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FDataSourceConfigLoader.java) | 从程序外的配置文件读取数据库的账号密码信息 单元测试默认配置环境 | [ @ActiveProfiles("test") ](app%2Fsrc%2Ftest%2Fjava%2Fhxy%2Fdream%2FBaseTest.java) | 解决每次修改yaml文件的烦恼 | -具体框架如下表: +# 基础理论项目研究 + + 基础理论 | 项目地址 +------|------------------------------------------ + IoC | https://gitee.com/eric-tutorial/easy-ioc + RPC | https://gitee.com/aohanhongzhi/my-rpc ## jdk下载 @@ -33,7 +38,11 @@ https://www.azul.com/ ### 热加载技术 -**最新版本的IDEA2024.2 已经默认支持了热加载。** +#### IDEA2024.2 + +**最新版本的IDEA2024.2 已经默认支持了热加载。也是需要在debug模式下。** + +#### 【废弃】第三方插件 这个针对的是[Jetbrains Runtime](https://github.com/JetBrains/JetBrainsRuntime/releases) ,所以其他JDK慎重。实际测试jdk17 21都可以正常运行。 @@ -51,44 +60,6 @@ https://github.com/HotswapProjects/HotswapAgent 修改代码后,Build -> Rebuild Project (Ctrl + Shift + F9) 重新编译和加载修改的类文件即可生效。 -### 执行初始化的sql语句 - -有两种方案。一种借助与mybatis-plus 另一种就是mybatis的 - -#### 基于mybatis的sql执行方案 - -[hxy.dream.common.init.ApplicationStartupRunner](common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java) - -#### 基于mybatis-plus的sql执行方案 - -##### 基于mybatis-plus配置直接执行 - -https://www.baomidou.com/pages/226c21/#%E9%85%8D%E7%BD%AE - -```yaml -# DataSource Config -spring: - datasource: - driver-class-name: org.h2.Driver - username: root - password: test - sql: - init: - schema-locations: classpath:db/schema-h2.sql - data-locations: classpath:db/data-h2.sql -``` - -##### 基于mybatis-plus的sql执行方案 - -[hxy.dream.common.init.MysqlDdl](common/src/main/java/hxy/dream/common/init/MysqlDdl.java) - -### OpenFeign要退出历史舞台了 - -推荐 RestTemplate或者WebClient - -WebClient 声明式的API调用: -[RemoteApiConfig](common/src/main/java/hxy/dream/common/configuration/RemoteApiConfig.java) - ## structure ``` @@ -103,21 +74,7 @@ eric-dream 上面后缀server是服务治理模块。platform是业务应用模块。 **微服务=分布式开发+服务治理** -## gradle安装与配置 - -https://github.com/GradleCN/GradleSide - -如果IDEA自动下载gradle很慢。那么可以先提前安装好gradle,然后指定下安装目录即可。 -![](./asset/img/gradle-special-location.png) -![img.png](asset/img/gradle-wrapper.png) - -腾讯的代理镜像 - -https://mirrors.cloud.tencent.com/gradle/gradle-7.5.1-bin.zip - -https\://services.gradle.org/distributions/gradle-7.4-bin.zip - -![img_1.png](asset/img/gradle.png) +具体框架如下表: 技术 | 说明 | 官网 ----------------------|----------------------------------------------------|-------------------------------------------------------------------------------------------------------------- @@ -148,6 +105,22 @@ https\://services.gradle.org/distributions/gradle-7.4-bin.zip https://spring.io/projects/spring-boot#support +## gradle安装与配置 + +https://github.com/GradleCN/GradleSide + +如果IDEA自动下载gradle很慢。那么可以先提前安装好gradle,然后指定下安装目录即可。 +![](./asset/img/gradle-special-location.png) +![img.png](asset/img/gradle-wrapper.png) + +腾讯的代理镜像 + +https://mirrors.cloud.tencent.com/gradle/gradle-7.5.1-bin.zip + +https\://services.gradle.org/distributions/gradle-7.4-bin.zip + +![img_1.png](asset/img/gradle.png) + ### 命令打包,跳过TEST ```shell script @@ -302,7 +275,7 @@ https://blog.csdn.net/bandancer/article/details/84926383 [关于springboot中添加Filter的方法](https://www.jianshu.com/p/3d421fbce734) -### +### ``` WARN at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive (PoolBase.java:184) - HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@63ec6a5a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. -- Gitee From 2349f5457a796f1b5a5ad8603e6f95a914a7137f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 10 Jul 2024 11:10:05 +0800 Subject: [PATCH 176/204] =?UTF-8?q?=20JDK22=20=E8=AF=86=E5=88=AB=E4=B8=8D?= =?UTF-8?q?=E4=BA=86=E8=BF=99=E4=B8=AA=E5=8F=82=E6=95=B0=E4=BA=86=EF=BC=8C?= =?UTF-8?q?=E4=B9=9F=E4=B8=8D=E9=9C=80=E8=A6=81=E8=BF=99=E4=B8=AA=E6=8F=92?= =?UTF-8?q?=E4=BB=B6=EF=BC=8C=E5=B0=B1=E5=8F=AF=E4=BB=A5=E7=83=AD=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E7=B1=BB=E4=BA=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 496a9a5..f7e26e3 100644 --- a/README.md +++ b/README.md @@ -52,6 +52,8 @@ https://github.com/HotswapProjects/HotswapAgent -XX:+AllowEnhancedClassRedefinition -XX:HotswapAgent=fatjar ``` +> JDK22 识别不了这个参数了,也不需要这个插件,就可以热加载类了 + ![img_1.png](asset/img/update-vm-param.png) ![img.png](asset/img/HotswapAgentLocation.png) -- Gitee From be09d25fa9ad4ba675c605e0910eb4841d6fdb68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 13 Jul 2024 20:34:21 +0800 Subject: [PATCH 177/204] / --- app/src/test/resources/api/local.http | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/test/resources/api/local.http b/app/src/test/resources/api/local.http index d0f4463..7d6b6a7 100644 --- a/app/src/test/resources/api/local.http +++ b/app/src/test/resources/api/local.http @@ -1,3 +1,6 @@ +GET {{host}}/ + +### GET {{host}}/user/get/1 ### 添加 -- Gitee From f4c15b9d21857a1a1293734020429f895f1e5898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 16 Jul 2024 16:32:37 +0800 Subject: [PATCH 178/204] =?UTF-8?q?=E4=BC=98=E5=8C=96AES=E5=8A=A0=E5=AF=86?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/CustomTypeHandler.java | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java b/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java index 5144bf3..61cc1b2 100644 --- a/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java +++ b/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java @@ -20,32 +20,44 @@ import java.sql.SQLException; @Service public class CustomTypeHandler extends BaseTypeHandler { - - public CustomTypeHandler() { - } + private final String AES_PREFIX = "{aes}"; @Override public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { - ps.setString(i, AesCbcEncryption.encrypt((String) parameter)); + String encrypt = AesCbcEncryption.encrypt((String) parameter); + encrypt = AES_PREFIX + encrypt; + ps.setString(i, encrypt); } @Override public T getNullableResult(ResultSet rs, String columnName) throws SQLException { String columnValue = rs.getString(columnName); - //有一些可能是空字符 - return StringUtils.isBlank(columnValue) ? (T) columnValue : (T) AesCbcEncryption.decrypt(columnValue); + if (columnValue != null && columnValue.startsWith(AES_PREFIX)) { + columnValue = columnValue.replace(AES_PREFIX, ""); + //有一些可能是空字符 + return StringUtils.isBlank(columnValue) ? (T) columnValue : (T) AesCbcEncryption.decrypt(columnValue); + } + return (T) columnValue; } @Override public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String columnValue = rs.getString(columnIndex); - return StringUtils.isBlank(columnValue) ? (T) columnValue : (T) AesCbcEncryption.decrypt(columnValue); + if (columnValue != null && columnValue.startsWith(AES_PREFIX)) { + columnValue = columnValue.replace(AES_PREFIX, ""); + return StringUtils.isBlank(columnValue) ? (T) columnValue : (T) AesCbcEncryption.decrypt(columnValue); + } + return (T) columnValue; } @Override public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String columnValue = cs.getString(columnIndex); - return StringUtils.isBlank(columnValue) ? (T) columnValue : (T) AesCbcEncryption.decrypt(columnValue); + if (columnValue != null && columnValue.startsWith(AES_PREFIX)) { + columnValue = columnValue.replace(AES_PREFIX, ""); + return StringUtils.isBlank(columnValue) ? (T) columnValue : (T) AesCbcEncryption.decrypt(columnValue); + } + return (T) columnValue; } } -- Gitee From 73e7a6bce1f1c2517a070fd08561e3dabfa3254b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 16 Jul 2024 16:38:22 +0800 Subject: [PATCH 179/204] =?UTF-8?q?=E4=B8=BA=E7=A9=BA=E4=B8=8D=E5=8A=A0?= =?UTF-8?q?=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dao/configuration/mybatis/CustomTypeHandler.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java b/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java index 61cc1b2..2943c8b 100644 --- a/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java +++ b/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import hxy.dream.dao.util.AesCbcEncryption; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; -import org.springframework.stereotype.Service; import java.sql.CallableStatement; import java.sql.PreparedStatement; @@ -17,15 +16,17 @@ import java.sql.SQLException; * * @param */ -@Service public class CustomTypeHandler extends BaseTypeHandler { private final String AES_PREFIX = "{aes}"; @Override public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException { - String encrypt = AesCbcEncryption.encrypt((String) parameter); - encrypt = AES_PREFIX + encrypt; + String encrypt = (String) parameter; + if (parameter != null) { + encrypt = AesCbcEncryption.encrypt((String) parameter); + encrypt = AES_PREFIX + encrypt; + } ps.setString(i, encrypt); } -- Gitee From 1159ccce58679e4d8ce57c336ee42a70086ff967 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 17 Jul 2024 22:14:28 +0800 Subject: [PATCH 180/204] =?UTF-8?q?mybatis=E5=8A=A0=E5=AF=86=E5=92=8Cmybat?= =?UTF-8?q?is-plus=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/resources/mapper/UserMapper.xml | 33 +++++++++++++++++++ app/src/main/resources/table.sql | 2 +- .../hxy/dream/dao/mapper/UserMapperTest.java | 14 +++++++- .../java/hxy/dream/dao/mapper/UserMapper.java | 2 ++ .../java/hxy/dream/dao/model/UserModel.java | 3 ++ .../hxy/dream/dao/util/AesCbcEncryption.java | 4 +-- 6 files changed, 54 insertions(+), 4 deletions(-) diff --git a/app/src/main/resources/mapper/UserMapper.xml b/app/src/main/resources/mapper/UserMapper.xml index 81de2cc..1e594cb 100644 --- a/app/src/main/resources/mapper/UserMapper.xml +++ b/app/src/main/resources/mapper/UserMapper.xml @@ -3,6 +3,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> + + + + + + + + + + + + + select id, name, password, address, phone_number + from user_model + + update user_model set name = #{name}, @@ -10,4 +28,19 @@ deleted = 0 where id = #{id} + + + diff --git a/app/src/main/resources/table.sql b/app/src/main/resources/table.sql index db21dbe..92e5c5f 100644 --- a/app/src/main/resources/table.sql +++ b/app/src/main/resources/table.sql @@ -3,7 +3,7 @@ create table if not exists user_model id int unsigned auto_increment primary key, name varchar(20) not null, - phone char(11) null, + phone_number char(11) null, address varchar(256) null, age int null comment '年龄', gender int null comment '性别', diff --git a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java index 3b4fa31..0a35590 100644 --- a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java +++ b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java @@ -25,8 +25,11 @@ public class UserMapperTest extends BaseTest { @Test public void testInsertOrUpdateSetNull() { UserModel userModel = new UserModel(); - userModel.setId(1); + userModel.setId(2); + userModel.setName("rblc"); userModel.setAge(231); + userModel.setAddress("上海"); + userModel.setPhoneNumber("18010472947"); boolean update = userMapper.insertOrUpdate(userModel); log.info("Updated user{}", update); } @@ -69,4 +72,13 @@ public class UserMapperTest extends BaseTest { userMapper.updateWithoutLogicDelete(userModel); } + @Test + public void testSelectUserModel(){ + UserModel userModel = new UserModel(); +// userModel.setId(1); + userModel.setPhoneNumber("18010472947"); + UserModel userModel1 = userMapper.selectUserModel(userModel); + log.info("userModel1 {}", userModel1); + } + } diff --git a/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java b/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java index fc305bb..a184a15 100644 --- a/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java +++ b/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java @@ -16,4 +16,6 @@ public interface UserMapper extends BaseMapper { */ int updateWithoutLogicDelete(UserModel userModel); + UserModel selectUserModel(UserModel userModel); + } diff --git a/dao/src/main/java/hxy/dream/dao/model/UserModel.java b/dao/src/main/java/hxy/dream/dao/model/UserModel.java index 88da8f8..05b9ed8 100644 --- a/dao/src/main/java/hxy/dream/dao/model/UserModel.java +++ b/dao/src/main/java/hxy/dream/dao/model/UserModel.java @@ -36,6 +36,9 @@ public class UserModel extends BaseModel { @TableField(typeHandler = CustomTypeHandler.class) private String address; + @TableField(typeHandler = CustomTypeHandler.class) + private String phoneNumber; + /** * 注意!! 必须开启映射注解 * diff --git a/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java b/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java index 788f40a..9e3c63e 100644 --- a/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java +++ b/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java @@ -17,8 +17,8 @@ public class AesCbcEncryption { private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; private static final int KEY_SIZE = 128; // 使用与Golang相同的key和iv - static String key = "qwertyuiopasdfgr"; - static String iv = "qwertyuiopasdfgh"; + static String key = "rblctyuiopasdfgr"; + static String iv = "rblctyuiopasdfgh"; // public static void main(String[] args) { // try { -- Gitee From d38dbe7dc64eb4b2bf1a64087e43b64159bd5b0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 17 Jul 2024 22:43:58 +0800 Subject: [PATCH 181/204] =?UTF-8?q?aes=E8=A7=A3=E5=AF=86=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/hxy/dream/dao/util/AesCbcEncryption.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java b/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java index 9e3c63e..a240060 100644 --- a/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java +++ b/dao/src/main/java/hxy/dream/dao/util/AesCbcEncryption.java @@ -78,10 +78,16 @@ public class AesCbcEncryption { try { decrypted = cbcDecrypt(encrypted1, key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8)); } catch (Exception e) { - log.error("{}", e.getMessage(), e); + log.error("解密错误 {}", e.getMessage(), e); + } + if (decrypted != null) { + // 不能为空 + String decryptedText = new String(decrypted, StandardCharsets.UTF_8); + return decryptedText; + } else { + log.error("解密错误 {}", encryptedBase64); } - String decryptedText = new String(decrypted, StandardCharsets.UTF_8); - return decryptedText; + return encryptedBase64; } private static byte[] cbcEncrypt(byte[] text, byte[] key, byte[] iv) throws Exception { -- Gitee From 8e49d4d6a0319c09364ae689fca672323c262dc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 19 Jul 2024 11:55:43 +0800 Subject: [PATCH 182/204] =?UTF-8?q?=E5=8A=A0=E5=AF=86=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=E5=BE=97=E5=86=99sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hxy/dream/dao/mapper/UserMapperTest.java | 27 ++++++++++++++++++- .../java/hxy/dream/dao/mapper/UserMapper.java | 13 +++++++++ 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java index 0a35590..7b4e47c 100644 --- a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java +++ b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java @@ -8,6 +8,8 @@ import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.List; + /** * @author eric * @description @@ -73,7 +75,7 @@ public class UserMapperTest extends BaseTest { } @Test - public void testSelectUserModel(){ + public void testSelectUserModel() { UserModel userModel = new UserModel(); // userModel.setId(1); userModel.setPhoneNumber("18010472947"); @@ -81,4 +83,27 @@ public class UserMapperTest extends BaseTest { log.info("userModel1 {}", userModel1); } + + /** + * 不使用加密 + */ + @Test + public void testSelectUserModelNoEncrypt() { + LambdaUpdateWrapper userModelLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); + userModelLambdaUpdateWrapper.eq(UserModel::getPhoneNumber, "18010472947"); + List userModels = userMapper.selectList(userModelLambdaUpdateWrapper); + log.info("userModels {}", userModels); + } + + + @Test + public void testSelectUserModelEncrypt() { + UserModel userModel = new UserModel(); +// userModel.setId(1); + userModel.setPhoneNumber("18010472947"); + List userModels = userMapper.listByNumber(userModel); + log.info("userModels {}", userModels); + } + + } diff --git a/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java b/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java index a184a15..52ad906 100644 --- a/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java +++ b/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java @@ -2,6 +2,11 @@ package hxy.dream.dao.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import hxy.dream.dao.model.UserModel; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; + +import java.util.List; /** * @author iris @@ -18,4 +23,12 @@ public interface UserMapper extends BaseMapper { UserModel selectUserModel(UserModel userModel); + + @Results(id = "resultMap", value = { + @Result(column = "address", property = "address", typeHandler = hxy.dream.dao.configuration.mybatis.CustomTypeHandler.class), + @Result(column = "phone_number", property = "phoneNumber", typeHandler = hxy.dream.dao.configuration.mybatis.CustomTypeHandler.class) + }) + @Select("select * from user_model where phone_number = #{phoneNumber} or phone_number= #{phoneNumber, typeHandler=hxy.dream.dao.configuration.mybatis.CustomTypeHandler}") + List listByNumber(UserModel userModel); + } -- Gitee From 68eeb83854135fe89598063ac74809e71a9a3861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 19 Jul 2024 12:03:54 +0800 Subject: [PATCH 183/204] =?UTF-8?q?=20=20=20=20/**=20=20=20=20=20=20*=20?= =?UTF-8?q?=20=20=EF=BC=81=EF=BC=81=EF=BC=81=20mp=E7=9A=84=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E9=87=8C=E6=98=AF=E4=B8=8D=E4=BC=9A=E7=94=A8=E8=BF=99?= =?UTF-8?q?=E4=B8=AA=E8=87=AA=E5=AE=9A=E4=B9=89=E7=B1=BB=E5=9E=8B=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=99=A8=E7=9A=84=EF=BC=8C=E5=8E=9F=E6=9D=A5=E6=98=AF?= =?UTF-8?q?=E5=95=A5=E5=B0=B1=E6=98=AF=E5=95=A5=EF=BC=81=EF=BC=81=EF=BC=81?= =?UTF-8?q?=20=20=20=20=20=20*/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java | 2 +- .../dream/dao/configuration/mybatis/CustomTypeHandler.java | 2 ++ dao/src/main/java/hxy/dream/dao/model/UserModel.java | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java index 7b4e47c..ea84666 100644 --- a/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java +++ b/app/src/test/java/hxy/dream/dao/mapper/UserMapperTest.java @@ -85,7 +85,7 @@ public class UserMapperTest extends BaseTest { /** - * 不使用加密 + * 不使用加密,条件查询的时候是没有使用自定义的类型处理器 */ @Test public void testSelectUserModelNoEncrypt() { diff --git a/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java b/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java index 2943c8b..6693435 100644 --- a/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java +++ b/dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java @@ -11,6 +11,8 @@ import java.sql.ResultSet; import java.sql.SQLException; /** + * !!! mp的条件里是不会用这个自定义类型处理器的,原来是啥就是啥!!! + *

* 数据库字段加解密处理。 * 加密后就有一个问题,没办法对数据进行检索了。比如like查询。但是mybatis-plus提供了自己企业版的加密方式可以做到。https://baomidou.com/pages/1864e1/#%E5%AD%97%E6%AE%B5%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86 * diff --git a/dao/src/main/java/hxy/dream/dao/model/UserModel.java b/dao/src/main/java/hxy/dream/dao/model/UserModel.java index 05b9ed8..a7390c4 100644 --- a/dao/src/main/java/hxy/dream/dao/model/UserModel.java +++ b/dao/src/main/java/hxy/dream/dao/model/UserModel.java @@ -32,10 +32,16 @@ public class UserModel extends BaseModel { private GenderEnum gender; private String password; + /** + * !! mp的条件里是不会用这个自定义类型处理器的,原来是啥就是啥!!! + */ //有了这个数据库BaseMapper插入的时候才能加密 @TableField(typeHandler = CustomTypeHandler.class) private String address; + /** + * !!! mp的条件里是不会用这个自定义类型处理器的,原来是啥就是啥!!! + */ @TableField(typeHandler = CustomTypeHandler.class) private String phoneNumber; -- Gitee From 912a8440e03f2148065880e283e80b7c1dda36de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 19 Jul 2024 12:32:15 +0800 Subject: [PATCH 184/204] =?UTF-8?q?=E5=8A=A0=E5=AF=86=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=B2=A1=E5=8A=9E=E6=B3=95=E5=81=9A=E6=A8=A1=E7=B3=8A=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java b/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java index 52ad906..52b3b35 100644 --- a/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java +++ b/dao/src/main/java/hxy/dream/dao/mapper/UserMapper.java @@ -24,6 +24,12 @@ public interface UserMapper extends BaseMapper { UserModel selectUserModel(UserModel userModel); + /** + * 没办法去做模糊查询了 + * + * @param userModel + * @return + */ @Results(id = "resultMap", value = { @Result(column = "address", property = "address", typeHandler = hxy.dream.dao.configuration.mybatis.CustomTypeHandler.class), @Result(column = "phone_number", property = "phoneNumber", typeHandler = hxy.dream.dao.configuration.mybatis.CustomTypeHandler.class) -- Gitee From ced4d580329de935e414d0c946b2f13418240f3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 19 Jul 2024 13:48:34 +0800 Subject: [PATCH 185/204] =?UTF-8?q?=E5=8A=A0=E5=AF=86=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E6=B2=A1=E5=8A=9E=E6=B3=95=E5=81=9A=E6=A8=A1=E7=B3=8A=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f7e26e3..384180b 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决字符串"null"等问题 敏感信息从程序外配置文件读取 | [RemoteEnvironmentPostProcessor.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FRemoteEnvironmentPostProcessor.java) 极海的方案 [DataSourceConfigLoader.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FDataSourceConfigLoader.java) | 从程序外的配置文件读取数据库的账号密码信息 单元测试默认配置环境 | [ @ActiveProfiles("test") ](app%2Fsrc%2Ftest%2Fjava%2Fhxy%2Fdream%2FBaseTest.java) | 解决每次修改yaml文件的烦恼 | - +数据库字段加密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 不支持模糊查询 # 基础理论项目研究 基础理论 | 项目地址 @@ -294,6 +294,8 @@ https://blog.csdn.net/qq_27127145/article/details/85775240 [MybatisPlus数据库加解密](https://gitee.com/aohanhongzhi/study/blob/dev/src/SpringBoot/Mybatis-plus%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AD%97%E6%AE%B5%E5%8A%A0%E8%A7%A3%E5%AF%86.md) [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) +https://blog.csdn.net/YW_Danny/article/details/120031966 + > https://blog.csdn.net/u012954706/article/details/105437768 # 封装类型与基础类型 -- Gitee From bacacff1136e16bfc7e7aac93fc13c752c3773e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 19 Jul 2024 13:57:12 +0800 Subject: [PATCH 186/204] kotlin --- asset/gradle-proxy-image/init.gradle | 8 +++++--- asset/gradle-proxy-image/init.gradle.kts | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/asset/gradle-proxy-image/init.gradle b/asset/gradle-proxy-image/init.gradle index dd7592d..ba8b3b8 100644 --- a/asset/gradle-proxy-image/init.gradle +++ b/asset/gradle-proxy-image/init.gradle @@ -1,7 +1,7 @@ def urlMappings = [ - "https://repo.maven.apache.org/maven2" : "https://mirrors.tencent.com/nexus/repository/maven-public/", - "https://dl.google.com/dl/android/maven2": "https://mirrors.tencent.com/nexus/repository/maven-public/", - "https://plugins.gradle.org/m2" : "https://mirrors.tencent.com/nexus/repository/gradle-plugins/" + "https://repo.maven.apache.org/maven2" : "https://mirrors.tencent.com/nexus/repository/maven-public/", + "https://dl.google.com/dl/android/maven2": "https://mirrors.tencent.com/nexus/repository/maven-public/", + "https://plugins.gradle.org/m2" : "https://mirrors.tencent.com/nexus/repository/gradle-plugins/" ] def enableMirror = { @@ -12,6 +12,8 @@ def enableMirror = { if (mirrorUrl) { logger.lifecycle("Repository[${repo.url}] is mirrored to $mirrorUrl") repo.setUrl(mirrorUrl) + } else { + logger.lifecycle("[Groovy]Repository[${repo.url}] not config proxy.") } } } diff --git a/asset/gradle-proxy-image/init.gradle.kts b/asset/gradle-proxy-image/init.gradle.kts index 071ac37..db25f2e 100644 --- a/asset/gradle-proxy-image/init.gradle.kts +++ b/asset/gradle-proxy-image/init.gradle.kts @@ -5,6 +5,8 @@ fun RepositoryHandler.enableMirror() { urlMappings[originalUrl]?.let { logger.lifecycle("Repository[$url] is mirrored to $it") this.setUrl(it) + } ?: run { + logger.lifecycle("[Kotlin]Repository[$originalUrl] has no mirror configured") } } } @@ -23,7 +25,7 @@ gradle.allprojects { repositories.enableMirror() } -gradle.beforeSettings { +gradle.beforeSettings { pluginManagement.repositories.enableMirror() // 6.8 及更高版本执行 DependencyResolutionManagement 配置 if (gradle.gradleVersion >= "6.8") { -- Gitee From c9f61dbf41e898e2250ed9fe6fafdff767b7d2a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 22 Jul 2024 11:36:29 +0800 Subject: [PATCH 187/204] bump springboot from 3.3.1 to 3.3.2 --- README.md | 4 +++- build.gradle | 6 +++++- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 384180b..c057009 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,8 @@ https://www.azul.com/ #### 【废弃】第三方插件 -这个针对的是[Jetbrains Runtime](https://github.com/JetBrains/JetBrainsRuntime/releases) ,所以其他JDK慎重。实际测试jdk17 21都可以正常运行。 +这个针对的是[Jetbrains Runtime](https://github.com/JetBrains/JetBrainsRuntime/releases) ,所以其他JDK慎重。实际测试jdk17 +21都可以正常运行。 https://github.com/HotswapProjects/HotswapAgent @@ -86,6 +87,7 @@ eric-dream MyBatis | ORM框架 | [http://www.mybatis.org/mybatis-3/zh/index.html](http://www.mybatis.org/mybatis-3/zh/index.html) MyBatisPlus | ORM框架补充 | [https://baomidou.com/](https://baomidou.com/) MyBatisGenerator | 数据层代码生成 | [http://www.mybatis.org/generator/index.html](http://www.mybatis.org/generator/index.html) + doc-apis | 零侵入接口文档生成工具 | https://github.com/xpc1024/doc-apis Swagger-UI | 文档生产工具 | [https://github.com/swagger-api/swagger-ui](https://github.com/swagger-api/swagger-ui) Hibernator-Validator | 验证框架 | [http://hibernate.org/validator/](http://hibernate.org/validator/) Elasticsearch | 搜索引擎 | [https://github.com/elastic/elasticsearch](https://github.com/elastic/elasticsearch) diff --git a/build.gradle b/build.gradle index 2389e78..f7ba1ce 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.3.1' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.3.2' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() @@ -161,6 +161,10 @@ subprojects { testCompileOnly 'org.projectlombok:lombok' testImplementation 'io.projectreactor:reactor-test' + +// 有待进一步完善 https://github.com/xpc1024/doc-apis +// implementation 'com.doc-apis:doc-apis-starter:1.0.0' + // https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-alibaba-sentinel // compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-alibaba-sentinel', version: '0.9.0.RELEASE' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 73c30fb..e113490 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists #distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.3-bin.zip -distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.8-bin.zip +distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.9-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -- Gitee From 3bedc75236af3c10d0c49067d0fd4c299fe72683 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 28 Jul 2024 17:47:32 +0800 Subject: [PATCH 188/204] log dir optimize --- .../CustomLogContextListener.java | 54 ++++++++++++++++--- 1 file changed, 46 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/configuration/CustomLogContextListener.java b/common/src/main/java/hxy/dream/common/configuration/CustomLogContextListener.java index a894f84..d22ae27 100644 --- a/common/src/main/java/hxy/dream/common/configuration/CustomLogContextListener.java +++ b/common/src/main/java/hxy/dream/common/configuration/CustomLogContextListener.java @@ -11,6 +11,9 @@ import org.springframework.util.ResourceUtils; import java.io.File; import java.io.FileNotFoundException; +import java.net.URL; +import java.security.CodeSource; +import java.security.ProtectionDomain; /** * @version 1.0 @@ -49,26 +52,61 @@ public class CustomLogContextListener extends ContextAwareBase implements Logger } + /** + * // classpath:file:/home/eric/Project/RBLC/spf_rblc_backend/target/rblc-spf.jar!/BOOT-INF/classes!/ + * // classpath:nested:/home/eric/Project/Java/air-share/build/libs/air-share-0.0.1-SNAPSHOT.jar/!BOOT-INF/classes/!/ + */ @Override public void start() { String classpath = null; - try { - classpath = ResourceUtils.getURL(ResourceUtils.CLASSPATH_URL_PREFIX).getPath(); - } catch (FileNotFoundException e) { - System.err.println("File not found" + e.getMessage()); + + if (true) { + // SpringBoot 推荐 + try { + classpath = ResourceUtils.getURL(ResourceUtils.CLASSPATH_URL_PREFIX).getPath(); + System.out.println("springboot get classpath:" + classpath); + } catch (FileNotFoundException e) { + System.err.println("File not found" + e.getMessage()); + } + } else { + // 非Spring推荐 + ProtectionDomain protectionDomain = CustomLogContextListener.class.getProtectionDomain(); + CodeSource codeSource = protectionDomain.getCodeSource(); + URL location = codeSource.getLocation(); + System.out.println("java :" + location); + System.out.println("java classpath:" + location.getPath()); } String logPath = "./logs"; // 判断是否jar 包启动 - if (classpath != null && classpath.contains("jar!")) { - System.out.println("classpath:" + classpath); - String currentPath = new File(classpath).getParentFile().getParentFile().getParent(); + if (classpath != null && (classpath.contains("file:") || classpath.contains("nested:")) && classpath.contains(".jar") && classpath.contains("BOOT-INF")) { + String jarFilePath = classpath.substring(0, classpath.indexOf(".jar")); + System.out.println("jarFilePath:" + jarFilePath); + File file = new File(jarFilePath); + String currentPath = file.getParent(); +// String currentPath = new File(jarFilePath).getParentFile().getParentFile().getParent(); // 如果是jar包启动的,那么获取当前jar包程序的路径,作为日志存放的位置 - currentPath = currentPath.replace("file:", ""); + if (classpath.startsWith("file:")) { + currentPath = currentPath.replace("file:", ""); + } else if (classpath.startsWith("nested:")) { + currentPath = currentPath.replace("nested:", ""); + } else { + int i = currentPath.indexOf(File.separator); + currentPath = currentPath.substring(i); + } logPath = currentPath + File.separator + "logs"; } + // 判断文件夹是否存在,不存在需要新建 + File file = new File(logPath); + if (!file.exists()) { + boolean mkdirs = file.mkdirs(); + if (mkdirs) { + System.out.println("日志存储路径创建成功 " + logPath); + } + } + System.out.println("日志存储路径 " + logPath); System.setProperty(LOG_PAHT_KEY, logPath); Context context = getContext(); -- Gitee From 3f522e5a0de37511ef61ebda82c4550b0bd2b7ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sun, 28 Jul 2024 18:02:24 +0800 Subject: [PATCH 189/204] bump --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index f7ba1ce..7d4b06f 100644 --- a/build.gradle +++ b/build.gradle @@ -136,14 +136,14 @@ subprojects { implementation 'cn.langpy:ko-time:2.4.2' implementation 'org.springframework.boot:spring-boot-starter-aop' // implementation 'javax.servlet:javax.servlet-api:4.0.1' - implementation 'jakarta.servlet:jakarta.servlet-api:6.1.0-M1' + implementation 'jakarta.servlet:jakarta.servlet-api:6.1.0' // implementation 'javax.annotation:javax.annotation-api:1.3.2' - implementation 'jakarta.annotation:jakarta.annotation-api:3.0.0-M1' + implementation 'jakarta.annotation:jakarta.annotation-api:3.0.0' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-webflux' testImplementation 'org.springframework.boot:spring-boot-starter-test' - implementation 'com.squareup.okio:okio:3.2.0' // 解决mock启动错误 + implementation 'com.squareup.okio:okio:3.9.0' // 解决mock启动错误 implementation 'org.springframework.data:spring-data-redis' -- Gitee From cc1f4d490b6f2fa276a2869bd911ecdf9d2d11e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Fri, 20 Sep 2024 10:33:45 +0800 Subject: [PATCH 190/204] bump springboot from 3.3.2 to 3.3.4 --- build.gradle | 2 +- entity/build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 7d4b06f..4e0596b 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.3.2' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.3.4' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() diff --git a/entity/build.gradle b/entity/build.gradle index fc0385f..7af8ff5 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,7 +8,7 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.7' + api 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.8' api 'org.springframework.boot:spring-boot-starter-validation' api 'jakarta.annotation:jakarta.annotation-api:3.0.0-M1' diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e113490..6b76b32 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists #distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8.3-bin.zip -distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.9-bin.zip +distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.10-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME -- Gitee From 3045f795eda2cf313f04cbf363255f56cfb18537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 7 Oct 2024 00:24:24 +0800 Subject: [PATCH 191/204] bump --- build.gradle | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 4e0596b..509f658 100644 --- a/build.gradle +++ b/build.gradle @@ -35,7 +35,7 @@ buildscript { plugins { id 'java-library' // https://github.com/spring-gradle-plugins/dependency-management-plugin - id 'io.spring.dependency-management' version '1.1.5' + id 'io.spring.dependency-management' version '1.1.6' id 'idea' id "com.google.cloud.tools.jib" version "2.0.0" // https://github.com/graalvm/native-build-tools @@ -44,9 +44,9 @@ plugins { java { - sourceCompatibility = JavaVersion.VERSION_21 +// sourceCompatibility = JavaVersion.VERSION_21 /* 指定jdk版本 */ - targetCompatibility = JavaVersion.VERSION_21 +// targetCompatibility = JavaVersion.VERSION_21 } description = "Spring Boot multi gradle project" @@ -133,23 +133,23 @@ subprojects { dependencies { // 暂不支持SpringBoot3 https://gitee.com/huoyo/ko-time/issues/I880X2 - implementation 'cn.langpy:ko-time:2.4.2' +// implementation 'cn.langpy:ko-time:3.0.1' implementation 'org.springframework.boot:spring-boot-starter-aop' - // implementation 'javax.servlet:javax.servlet-api:4.0.1' implementation 'jakarta.servlet:jakarta.servlet-api:6.1.0' -// implementation 'javax.annotation:javax.annotation-api:1.3.2' implementation 'jakarta.annotation:jakarta.annotation-api:3.0.0' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-webflux' testImplementation 'org.springframework.boot:spring-boot-starter-test' - implementation 'com.squareup.okio:okio:3.9.0' // 解决mock启动错误 + implementation 'com.squareup.okio:okio:3.9.1' // 解决mock启动错误 implementation 'org.springframework.data:spring-data-redis' - implementation 'com.zaxxer:HikariCP:5.1.0' +// https://github.com/brettwooldridge/HikariCP + implementation 'com.zaxxer:HikariCP:6.0.0' +// https://github.com/p6spy/p6spy implementation 'p6spy:p6spy:3.9.1' - implementation 'commons-io:commons-io:2.15.0' + implementation 'commons-io:commons-io:2.16.1' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8' // Java 8 Datatypes -- Gitee From 02d18e6358d60cdab5f5fe600a7660add1434b53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 16 Oct 2024 17:21:22 +0800 Subject: [PATCH 192/204] =?UTF-8?q?=E8=AF=B7=E6=B1=82=E6=97=A5=E5=BF=97?= =?UTF-8?q?=EF=BC=8C=E5=92=8Crequest=E5=92=8Cresponse=E7=9A=84=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/resources/application-test.yml | 2 +- .../configuration/RequestLoggingConfig.java | 24 +++++++++++++++ .../common/filter/RequestWrapperFilter.java | 25 ++++++++++++++++ .../common/filter/ResponseWrapperFilter.java | 29 +++++++++++++++++++ 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/hxy/dream/common/configuration/RequestLoggingConfig.java create mode 100644 common/src/main/java/hxy/dream/common/filter/RequestWrapperFilter.java create mode 100644 common/src/main/java/hxy/dream/common/filter/ResponseWrapperFilter.java diff --git a/app/src/main/resources/application-test.yml b/app/src/main/resources/application-test.yml index fa202c2..620d159 100755 --- a/app/src/main/resources/application-test.yml +++ b/app/src/main/resources/application-test.yml @@ -49,7 +49,7 @@ logging: com.fasterxml.jackson: debug com.baomidou.mybatisplus: debug org.apache.ibatis: debug - + org.springframework.web.filter.CommonsRequestLoggingFilter: DEBUG mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl diff --git a/common/src/main/java/hxy/dream/common/configuration/RequestLoggingConfig.java b/common/src/main/java/hxy/dream/common/configuration/RequestLoggingConfig.java new file mode 100644 index 0000000..d5d56c5 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/configuration/RequestLoggingConfig.java @@ -0,0 +1,24 @@ +package hxy.dream.common.configuration; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.filter.CommonsRequestLoggingFilter; + +@Configuration +public class RequestLoggingConfig { + /** + * 类似gin的一样的请求log,不是详细的 + * + * @return + */ + @Bean + public CommonsRequestLoggingFilter logFilter() { + CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter(); + filter.setIncludeQueryString(true); + filter.setIncludePayload(true); + filter.setIncludeHeaders(true); + filter.setIncludeClientInfo(true); + filter.setAfterMessagePrefix("REQUEST DATA-"); + return filter; + } +} \ No newline at end of file diff --git a/common/src/main/java/hxy/dream/common/filter/RequestWrapperFilter.java b/common/src/main/java/hxy/dream/common/filter/RequestWrapperFilter.java new file mode 100644 index 0000000..5984485 --- /dev/null +++ b/common/src/main/java/hxy/dream/common/filter/RequestWrapperFilter.java @@ -0,0 +1,25 @@ +package hxy.dream.common.filter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.ContentCachingRequestWrapper; + +import java.io.IOException; + +@Component +public class RequestWrapperFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + ContentCachingRequestWrapper requestWrapper = new ContentCachingRequestWrapper(request); + // 可以在这里处理请求数据 + byte[] body = requestWrapper.getContentAsByteArray(); + // 处理body,例如记录日志 + //。。。 + filterChain.doFilter(requestWrapper, response); + } +} \ No newline at end of file diff --git a/common/src/main/java/hxy/dream/common/filter/ResponseWrapperFilter.java b/common/src/main/java/hxy/dream/common/filter/ResponseWrapperFilter.java new file mode 100644 index 0000000..7d36acc --- /dev/null +++ b/common/src/main/java/hxy/dream/common/filter/ResponseWrapperFilter.java @@ -0,0 +1,29 @@ +package hxy.dream.common.filter; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.ContentCachingResponseWrapper; + +import java.io.IOException; + +@Component +public class ResponseWrapperFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response); + filterChain.doFilter(request, responseWrapper); + + // 可以在这里处理响应数据 + byte[] body = responseWrapper.getContentAsByteArray(); + // 处理body,例如添加签名 + responseWrapper.setHeader("X-Signature", "some-signature"); + + // 必须调用此方法以将响应数据发送到客户端 + responseWrapper.copyBodyToResponse(); + } +} \ No newline at end of file -- Gitee From e86f3e2af2b7719a326d2b249d0e7317de48dc31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 19 Oct 2024 15:52:04 +0800 Subject: [PATCH 193/204] log set --- .../app/controller/LogResetController.java | 31 ++++++++++ app/src/main/resources/application.yml | 2 +- app/src/main/resources/logback-spring.xml | 7 ++- .../configuration/DataSourceConfigLoader.java | 61 ++++++++++--------- .../common/init/ApplicationStartupRunner.java | 2 +- 5 files changed, 72 insertions(+), 31 deletions(-) create mode 100644 app/src/main/java/hxy/dream/app/controller/LogResetController.java diff --git a/app/src/main/java/hxy/dream/app/controller/LogResetController.java b/app/src/main/java/hxy/dream/app/controller/LogResetController.java new file mode 100644 index 0000000..b9e75c3 --- /dev/null +++ b/app/src/main/java/hxy/dream/app/controller/LogResetController.java @@ -0,0 +1,31 @@ +package hxy.dream.app.controller; + +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import hxy.dream.entity.vo.BaseResponseVO; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author HOX4SGH + * @description + * @date 2024/10/19 + */ +@RestController +public class LogResetController { + + /** + * /log/set?name=hxy.dream.app&level=info + * + * @param name + * @param level + * @return + */ + @GetMapping("/log/set") + public BaseResponseVO setLog(String name, String level) { + Logger logger = (Logger) LoggerFactory.getLogger(name); + logger.setLevel(Level.toLevel(level)); + return BaseResponseVO.success(); + } +} diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index 2e74d61..354df4e 100755 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -12,7 +12,7 @@ spring: multipart: enabled: false profiles: - active: beta #环境隔离 + active: dev #环境隔离 mail: username: aohanhongzhi@qq.com password: vtrxapjtpcivdbcb diff --git a/app/src/main/resources/logback-spring.xml b/app/src/main/resources/logback-spring.xml index 3cd19cb..20af7c7 100644 --- a/app/src/main/resources/logback-spring.xml +++ b/app/src/main/resources/logback-spring.xml @@ -149,7 +149,10 @@ ${smtpHost} - 25 + 465 + + false + true ${to} @@ -207,12 +210,14 @@ + + diff --git a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java index 9542855..63fee35 100644 --- a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java +++ b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java @@ -38,40 +38,45 @@ public class DataSourceConfigLoader implements BeanPostProcessor, EnvironmentAwa public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof MybatisPlusAutoConfiguration) { //在mybatis初始化前搞定配置信息 - Map systemProperties = environment.getSystemProperties(); - // 读取配置文件,从配置文件中加载这个变量。 - String database = System.getProperty("user.home") + "/.config/eric-config/database.json"; - ObjectMapper objectMapper = new ObjectMapper(); - try { - JsonNode jsonObject = objectMapper.readTree(new File(database)); - if (!jsonObject.isEmpty()) { - String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); - String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); - String password = jsonObject.get("spring.datasource.password").textValue(); - if (databaseUrl.contains("jdbc:p6spy:mysql")) { - systemProperties.put("spring.datasource.driver-class-name", "com.p6spy.engine.spy.P6SpyDriver"); + String currentProfile = environment.getProperty("spring.profiles.active"); + if (currentProfile.equalsIgnoreCase("dev")) { + log.warn("本地调试,直接忽略读取本地配置文件信息"); + } else { + + Map systemProperties = environment.getSystemProperties(); + // 读取配置文件,从配置文件中加载这个变量。 + String database = System.getProperty("user.home") + "/.config/eric-config/database.json"; + ObjectMapper objectMapper = new ObjectMapper(); + try { + JsonNode jsonObject = objectMapper.readTree(new File(database)); + if (!jsonObject.isEmpty()) { + String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); + String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); + String password = jsonObject.get("spring.datasource.password").textValue(); + if (databaseUrl.contains("jdbc:p6spy:mysql")) { + systemProperties.put("spring.datasource.driver-class-name", "com.p6spy.engine.spy.P6SpyDriver"); + } else { + systemProperties.put("spring.datasource.driver-class-name", "com.mysql.cj.jdbc.Driver"); + } + systemProperties.put("spring.datasource.url", databaseUrl); + systemProperties.put("spring.datasource.username", databaseUsername); + systemProperties.put("spring.datasource.password", password); + + String r2dbcDatabaseUrl = jsonObject.get("spring.r2dbc.url").textValue(); + systemProperties.put("spring.r2dbc.url", r2dbcDatabaseUrl); + systemProperties.put("spring.r2dbc.username", databaseUsername); + systemProperties.put("spring.r2dbc.password", password); } else { - systemProperties.put("spring.datasource.driver-class-name", "com.mysql.cj.jdbc.Driver"); + log.error("没有数据库配置文件 {}", database); } - systemProperties.put("spring.datasource.url", databaseUrl); - systemProperties.put("spring.datasource.username", databaseUsername); - systemProperties.put("spring.datasource.password", password); - String r2dbcDatabaseUrl = jsonObject.get("spring.r2dbc.url").textValue(); - systemProperties.put("spring.r2dbc.url", r2dbcDatabaseUrl); - systemProperties.put("spring.r2dbc.username", databaseUsername); - systemProperties.put("spring.r2dbc.password", password); - } else { - log.error("没有数据库配置文件 {}", database); + } catch (JsonProcessingException e) { + log.error("{}", e.getMessage(), e); + } catch (IOException e) { + log.error("{}", e.getMessage(), e); } - - } catch (JsonProcessingException e) { - log.error("{}", e.getMessage(), e); - } catch (IOException e) { - log.error("{}", e.getMessage(), e); } } - return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName); } } diff --git a/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java b/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java index d483ce8..05f37e0 100644 --- a/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java +++ b/common/src/main/java/hxy/dream/common/init/ApplicationStartupRunner.java @@ -75,7 +75,7 @@ public class ApplicationStartupRunner implements CommandLineRunner { scriptRunner.runScript(Resources.getResourceAsReader("table.sql")); connection.commit(); } catch (Exception e) { - log.error("执行sql脚本失败", e); + log.error("执行sql脚本失败。数据库: {} 用户 {}", url, userName, e); } finally { if (jdbc) { if (connection != null) { -- Gitee From c21e07f58b74478662a3504f10ef1d82bd345643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Sat, 19 Oct 2024 16:27:49 +0800 Subject: [PATCH 194/204] =?UTF-8?q?email=E4=BD=BF=E7=94=A8ssl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +++++++++ app/src/main/resources/logback-spring.xml | 5 ++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c057009..5aa6138 100644 --- a/README.md +++ b/README.md @@ -313,3 +313,12 @@ https://blog.csdn.net/YW_Danny/article/details/120031966 有的前端输入带有空格或者换行,到数据库存储可能会发生意想不到的bug,所以需要在反序列化的时候,需要将其中的非法字符去掉。需要设计一个方案做下全局的参数trim() https://zhuanlan.zhihu.com/p/372585663 + + +## 日志开启ssl + +macbook下测试端口 + +```shell +nc -vz -w 2 smtp.qq.com 465 +``` \ No newline at end of file diff --git a/app/src/main/resources/logback-spring.xml b/app/src/main/resources/logback-spring.xml index 20af7c7..9b60d24 100644 --- a/app/src/main/resources/logback-spring.xml +++ b/app/src/main/resources/logback-spring.xml @@ -150,9 +150,9 @@ ${smtpHost} 465 + true false - true ${to} @@ -162,14 +162,13 @@ ${username} ${password} - false true %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n - 1 + 10 -- Gitee From 5749787e5a76b7b08a9599f91aa7fb9044fd6210 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 24 Oct 2024 14:22:42 +0800 Subject: [PATCH 195/204] bump dependency --- app/build.gradle | 2 +- build.gradle | 2 +- common/build.gradle | 14 +++++++------- .../hxy/dream/common/configuration/BeanConfig.java | 5 +++++ entity/build.gradle | 5 +++-- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 09e6081..7ef0c88 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,7 +7,7 @@ bootJar.enabled = true dependencies { api project(':common') - implementation 'cn.zhxu:okhttps:4.0.2' + implementation 'cn.zhxu:okhttps:4.0.3' implementation 'org.springframework.data:spring-data-redis' // implementation 'org.springframework.cloud:spring-cloud-starter-sleuth:3.1.7' // 已经不支持了 // implementation('com.yomahub:tlog-all-spring-boot-starter:1.5.1') { diff --git a/build.gradle b/build.gradle index 509f658..ad82060 100644 --- a/build.gradle +++ b/build.gradle @@ -149,7 +149,7 @@ subprojects { implementation 'com.zaxxer:HikariCP:6.0.0' // https://github.com/p6spy/p6spy implementation 'p6spy:p6spy:3.9.1' - implementation 'commons-io:commons-io:2.16.1' + implementation 'commons-io:commons-io:2.17.0' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8' // Java 8 Datatypes diff --git a/common/build.gradle b/common/build.gradle index 424f09b..ddee930 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -15,18 +15,18 @@ repositories { dependencies { api project(':dao') /* 子模块之间的依赖 */ - implementation 'cn.zhxu:okhttps:4.0.2' - implementation 'cn.zhxu:okhttps-jackson:4.0.2' + implementation 'cn.zhxu:okhttps:4.0.3' + implementation 'cn.zhxu:okhttps-jackson:4.0.3' api 'org.springframework.boot:spring-boot-starter-mail' implementation 'org.springframework.data:spring-data-redis' implementation 'redis.clients:jedis' - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2' - implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.15.2' // Java 8 Datatypes - implementation 'com.fasterxml.jackson:jackson-bom:2.17.0' // Java 8 Datatypes + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.18.0' + implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.18.0' // Java 8 Datatypes + implementation 'com.fasterxml.jackson:jackson-bom:2.18.0' // Java 8 Datatypes implementation group: 'org.javassist', name: 'javassist', version: '3.30.2-GA' - implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.22' - implementation 'org.redisson:redisson:3.28.0' + implementation group: 'org.aspectj', name: 'aspectjrt', version: '1.9.22.1' + implementation 'org.redisson:redisson:3.37.0' // https://cnblogs.com/keeya/p/13846807.html // https://github.com/redisson/redisson/tree/master/redisson-spring-boot-starter diff --git a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java index 1de6e33..065ea1a 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java @@ -11,6 +11,9 @@ import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.IllegalSQLInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -111,6 +114,8 @@ public class BeanConfig { interceptor.addInnerInterceptor(paginationInnerInterceptor); interceptor.addInnerInterceptor(blockAttackInnerInterceptor); +// 非法SQL拦截 + interceptor.addInnerInterceptor(new IllegalSQLInnerInterceptor()); return interceptor; } diff --git a/entity/build.gradle b/entity/build.gradle index 7af8ff5..10084bd 100644 --- a/entity/build.gradle +++ b/entity/build.gradle @@ -8,8 +8,9 @@ bootJar.enabled = false dependencies { // implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上api - api 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.8' + api 'com.baomidou:mybatis-plus-spring-boot3-starter:3.5.9' + api("com.baomidou:mybatis-plus-jsqlparser:3.5.9") api 'org.springframework.boot:spring-boot-starter-validation' - api 'jakarta.annotation:jakarta.annotation-api:3.0.0-M1' + api 'jakarta.annotation:jakarta.annotation-api:3.0.0' } \ No newline at end of file -- Gitee From 4240b2c01fa2c5661a8e880e782ae87d10127e86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Thu, 24 Oct 2024 14:28:14 +0800 Subject: [PATCH 196/204] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=8F=98=E5=8A=A8?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=8F=92=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/hxy/dream/common/configuration/BeanConfig.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java index 065ea1a..f936a27 100644 --- a/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java +++ b/common/src/main/java/hxy/dream/common/configuration/BeanConfig.java @@ -10,6 +10,7 @@ package hxy.dream.common.configuration; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.DataChangeRecorderInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.IllegalSQLInnerInterceptor; @@ -105,6 +106,14 @@ public class BeanConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + +// 数据变动记录插件 + DataChangeRecorderInnerInterceptor dataChangeRecorderInnerInterceptor = new DataChangeRecorderInnerInterceptor(); + // 配置安全阈值,例如限制批量更新或插入的记录数不超过 1000 条 + dataChangeRecorderInnerInterceptor.setBatchUpdateLimit(1000); + interceptor.addInnerInterceptor(dataChangeRecorderInnerInterceptor); + + // mybatisplus与pagehelper的功能冲突了,所以后面会带上两个limit PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL); paginationInnerInterceptor.setMaxLimit(100L); -- Gitee From 1bc45a99187c081d5704c920afd6e2ec1b29635a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Mon, 28 Oct 2024 15:41:31 +0800 Subject: [PATCH 197/204] bump --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index ad82060..a8bf745 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ */ buildscript { ext { - springBootVersion = '3.3.4' // https://spring.io/projects/spring-boot#learn + springBootVersion = '3.3.5' // https://spring.io/projects/spring-boot#learn } repositories { mavenLocal() -- Gitee From b00ebecc1234cae0858140ca7e6169865b1ceaf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 29 Oct 2024 09:57:58 +0800 Subject: [PATCH 198/204] =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=8A=80=E6=9C=AF?= =?UTF-8?q?=E6=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 5aa6138..2cc371d 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,8 @@ ## jdk下载 +https://www.graalvm.org/ + https://www.azul.com/ ### 热加载技术 @@ -321,4 +323,12 @@ macbook下测试端口 ```shell nc -vz -w 2 smtp.qq.com 465 +``` + +# 开发技术栈 + +https://github.com/hatoo/oha + +```shell +./oha-linux-amd64 --no-tui https://open.iciba.com/dsapi/?date=2023-05-03 ``` \ No newline at end of file -- Gitee From 3b22e5447de509a1536041b3445457c53315c93a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 29 Oct 2024 09:59:20 +0800 Subject: [PATCH 199/204] =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=8A=80=E6=9C=AF?= =?UTF-8?q?=E6=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2cc371d..6a91d8a 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,8 @@ 前端null传到后端成"null"字符串 | [StringToStringConverter](common/src/main/java/hxy/dream/common/converter/StringToStringConverter.java) | 解决字符串"null"等问题 敏感信息从程序外配置文件读取 | [RemoteEnvironmentPostProcessor.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FRemoteEnvironmentPostProcessor.java) 极海的方案 [DataSourceConfigLoader.java](common%2Fsrc%2Fmain%2Fjava%2Fhxy%2Fdream%2Fcommon%2Fconfiguration%2FDataSourceConfigLoader.java) | 从程序外的配置文件读取数据库的账号密码信息 单元测试默认配置环境 | [ @ActiveProfiles("test") ](app%2Fsrc%2Ftest%2Fjava%2Fhxy%2Fdream%2FBaseTest.java) | 解决每次修改yaml文件的烦恼 | -数据库字段加密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 不支持模糊查询 + 数据库字段加密 | [参考CustomTypeHandler](dao/src/main/java/hxy/dream/dao/configuration/mybatis/CustomTypeHandler.java) | 不支持模糊查询 + # 基础理论项目研究 基础理论 | 项目地址 @@ -281,7 +282,7 @@ https://blog.csdn.net/bandancer/article/details/84926383 [关于springboot中添加Filter的方法](https://www.jianshu.com/p/3d421fbce734) -### +### ``` WARN at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive (PoolBase.java:184) - HikariPool-1 - Failed to validate connection com.mysql.cj.jdbc.ConnectionImpl@63ec6a5a (No operations allowed after connection closed.). Possibly consider using a shorter maxLifetime value. @@ -316,7 +317,6 @@ https://blog.csdn.net/YW_Danny/article/details/120031966 https://zhuanlan.zhihu.com/p/372585663 - ## 日志开启ssl macbook下测试端口 @@ -327,6 +327,10 @@ nc -vz -w 2 smtp.qq.com 465 # 开发技术栈 +## 压测工具 + +并发数,吞吐量,延时,最快最慢请求等。 + https://github.com/hatoo/oha ```shell -- Gitee From 9dfb8c9e3eabcfa230677cccbaa7d3d237f4c14d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 29 Oct 2024 10:03:59 +0800 Subject: [PATCH 200/204] =?UTF-8?q?=E5=BC=80=E5=8F=91=E6=8A=80=E6=9C=AF?= =?UTF-8?q?=E6=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 6a91d8a..fe3bf1c 100644 --- a/README.md +++ b/README.md @@ -335,4 +335,8 @@ https://github.com/hatoo/oha ```shell ./oha-linux-amd64 --no-tui https://open.iciba.com/dsapi/?date=2023-05-03 +``` + +```shell +./oha-linux-amd64 -n 3000 https://open.iciba.com/dsapi/?date=2023-05-03 ``` \ No newline at end of file -- Gitee From bdae5d7ac03eb6bae6dda2c2cd8a048458fa4433 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Tue, 29 Oct 2024 14:12:27 +0800 Subject: [PATCH 201/204] =?UTF-8?q?emoj=E8=A1=A8=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++++- app/src/main/java/hxy/dream/app/Application.java | 2 +- app/src/main/resources/logback-spring.xml | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fe3bf1c..0e7fa00 100644 --- a/README.md +++ b/README.md @@ -339,4 +339,8 @@ https://github.com/hatoo/oha ```shell ./oha-linux-amd64 -n 3000 https://open.iciba.com/dsapi/?date=2023-05-03 -``` \ No newline at end of file +``` + +## emoj表情 + +https://www.emojiall.com/ \ No newline at end of file diff --git a/app/src/main/java/hxy/dream/app/Application.java b/app/src/main/java/hxy/dream/app/Application.java index daaf95e..046a6e9 100644 --- a/app/src/main/java/hxy/dream/app/Application.java +++ b/app/src/main/java/hxy/dream/app/Application.java @@ -22,7 +22,7 @@ public class Application { private static final Logger log = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { - log.info("\n<============ \uD83D\uDE80 JAVA版本:{} CPU核心数:{} \uD83D\uDE80 ============>", + log.info("\n<============ ⚠️ 🚀 JAVA版本:{} CPU核心数:{} \uD83D\uDE80 ============>", System.getProperty("java.version"), Runtime.getRuntime().availableProcessors()); System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "class"); log.info("当前CPU核心={},{}是否为守护线程={}", Runtime.getRuntime().availableProcessors(), diff --git a/app/src/main/resources/logback-spring.xml b/app/src/main/resources/logback-spring.xml index 9b60d24..dc28e06 100644 --- a/app/src/main/resources/logback-spring.xml +++ b/app/src/main/resources/logback-spring.xml @@ -165,7 +165,7 @@ true - %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n + ❌ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n 10 -- Gitee From e427bf2524ac3f38ee4e7f8da68648cc8ccdae10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 6 Nov 2024 15:28:46 +0800 Subject: [PATCH 202/204] =?UTF-8?q?=E5=8A=A0=E4=B8=8A=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuration/DataSourceConfigLoader.java | 39 +++++++++++-------- .../RemoteEnvironmentPostProcessor.java | 23 ++++++----- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java index 63fee35..481529a 100644 --- a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java +++ b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java @@ -48,26 +48,31 @@ public class DataSourceConfigLoader implements BeanPostProcessor, EnvironmentAwa String database = System.getProperty("user.home") + "/.config/eric-config/database.json"; ObjectMapper objectMapper = new ObjectMapper(); try { - JsonNode jsonObject = objectMapper.readTree(new File(database)); - if (!jsonObject.isEmpty()) { - String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); - String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); - String password = jsonObject.get("spring.datasource.password").textValue(); - if (databaseUrl.contains("jdbc:p6spy:mysql")) { - systemProperties.put("spring.datasource.driver-class-name", "com.p6spy.engine.spy.P6SpyDriver"); + File file = new File(database); + if (file.exists()) { + JsonNode jsonObject = objectMapper.readTree(file); + if (!jsonObject.isEmpty()) { + String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); + String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); + String password = jsonObject.get("spring.datasource.password").textValue(); + if (databaseUrl.contains("jdbc:p6spy:mysql")) { + systemProperties.put("spring.datasource.driver-class-name", "com.p6spy.engine.spy.P6SpyDriver"); + } else { + systemProperties.put("spring.datasource.driver-class-name", "com.mysql.cj.jdbc.Driver"); + } + systemProperties.put("spring.datasource.url", databaseUrl); + systemProperties.put("spring.datasource.username", databaseUsername); + systemProperties.put("spring.datasource.password", password); + + String r2dbcDatabaseUrl = jsonObject.get("spring.r2dbc.url").textValue(); + systemProperties.put("spring.r2dbc.url", r2dbcDatabaseUrl); + systemProperties.put("spring.r2dbc.username", databaseUsername); + systemProperties.put("spring.r2dbc.password", password); } else { - systemProperties.put("spring.datasource.driver-class-name", "com.mysql.cj.jdbc.Driver"); + log.warn("数据库配置文件没有信息 {}", database); } - systemProperties.put("spring.datasource.url", databaseUrl); - systemProperties.put("spring.datasource.username", databaseUsername); - systemProperties.put("spring.datasource.password", password); - - String r2dbcDatabaseUrl = jsonObject.get("spring.r2dbc.url").textValue(); - systemProperties.put("spring.r2dbc.url", r2dbcDatabaseUrl); - systemProperties.put("spring.r2dbc.username", databaseUsername); - systemProperties.put("spring.r2dbc.password", password); } else { - log.error("没有数据库配置文件 {}", database); + log.error("没有数据库配置文件,那就配置yaml文件吧 {}", database); } } catch (JsonProcessingException e) { diff --git a/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java b/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java index 6408558..2c23758 100644 --- a/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java +++ b/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java @@ -46,16 +46,21 @@ public class RemoteEnvironmentPostProcessor implements EnvironmentPostProcessor String database = System.getProperty("user.home") + "/.config/eric-config/database.json"; ObjectMapper objectMapper = new ObjectMapper(); try { - JsonNode jsonObject = objectMapper.readTree(new File(database)); - if (!jsonObject.isEmpty()) { - String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); - String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); - String password = jsonObject.get("spring.datasource.password").textValue(); - properties.put("spring.datasource.url", databaseUrl); - properties.put("spring.datasource.username", databaseUsername); - properties.put("spring.datasource.password", password); + File file = new File(database); + if (file.exists()) { + JsonNode jsonObject = objectMapper.readTree(file); + if (!jsonObject.isEmpty()) { + String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); + String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); + String password = jsonObject.get("spring.datasource.password").textValue(); + properties.put("spring.datasource.url", databaseUrl); + properties.put("spring.datasource.username", databaseUsername); + properties.put("spring.datasource.password", password); + } else { + log.error("数据库配置文件没有信息 {}", database); + } } else { - log.error("没有数据库配置文件{}", database); + log.error("没有数据库配置文件,那就配置yaml文件吧 {}", database); } } catch (JsonProcessingException e) { log.error("{}", e.getMessage(), e); -- Gitee From 41ad8b6c38c411510ab2768e618cd185583f4e9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 6 Nov 2024 19:53:06 +0800 Subject: [PATCH 203/204] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hxy/dream/common/configuration/DataSourceConfigLoader.java | 2 +- .../common/configuration/RemoteEnvironmentPostProcessor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java index 481529a..7ff5101 100644 --- a/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java +++ b/common/src/main/java/hxy/dream/common/configuration/DataSourceConfigLoader.java @@ -46,10 +46,10 @@ public class DataSourceConfigLoader implements BeanPostProcessor, EnvironmentAwa Map systemProperties = environment.getSystemProperties(); // 读取配置文件,从配置文件中加载这个变量。 String database = System.getProperty("user.home") + "/.config/eric-config/database.json"; - ObjectMapper objectMapper = new ObjectMapper(); try { File file = new File(database); if (file.exists()) { + ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonObject = objectMapper.readTree(file); if (!jsonObject.isEmpty()) { String databaseUrl = jsonObject.get("spring.datasource.url").textValue(); diff --git a/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java b/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java index 2c23758..be9e3ed 100644 --- a/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java +++ b/common/src/main/java/hxy/dream/common/configuration/RemoteEnvironmentPostProcessor.java @@ -44,10 +44,10 @@ public class RemoteEnvironmentPostProcessor implements EnvironmentPostProcessor // 读取配置文件,从配置文件中加载这个变量。 【腾讯文档】系统配置信息 https://docs.qq.com/doc/DSFdLamxuUXNWRVZJ String database = System.getProperty("user.home") + "/.config/eric-config/database.json"; - ObjectMapper objectMapper = new ObjectMapper(); try { File file = new File(database); if (file.exists()) { + ObjectMapper objectMapper = new ObjectMapper(); JsonNode jsonObject = objectMapper.readTree(file); if (!jsonObject.isEmpty()) { String databaseUsername = jsonObject.get("spring.datasource.username").textValue(); -- Gitee From 5407f0b7defa647bb3899b66d35fefdc99c1c4b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=8D=95=E9=A3=8E=E7=9A=84=E9=80=8D=E9=81=A5=E4=BE=AF?= Date: Wed, 20 Nov 2024 10:36:41 +0800 Subject: [PATCH 204/204] https://mp.weixin.qq.com/s/ITwlZZfxw9D9k1iJYqZakQ --- app/src/main/resources/application.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/resources/application.yml b/app/src/main/resources/application.yml index 354df4e..505aa6c 100755 --- a/app/src/main/resources/application.yml +++ b/app/src/main/resources/application.yml @@ -34,6 +34,8 @@ mybatis-plus: # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl local-cache-scope: statement # 每次执行sql。多个statement可能会在一个session里面。 这个是mybatis的一级缓存控制。 + return-instance-for-empty-row: true # https://mp.weixin.qq.com/s/ITwlZZfxw9D9k1iJYqZakQ + call-setters-on-nulls: true # default-enum-type-handler: org.apache.ibatis.type.EnumTypeHandler type-aliases-package: hxy.dream.dao.model # 支持通配符 * 或者 ; 分割 -- Gitee