本项目是基于Gradle构建的多模块SpringCloud工程。采用传统线程模型
的SpringWeb框架,mybatis-plus和mysql官方驱动。非常适合入门者学习。本项目的一大亮点就是自定义枚举序列化的处理。
功能 | 实现 | 用途 |
---|---|---|
IDEA开发热加载实现 | JBR + HotswapAgent | https://github.com/HotswapProjects/HotswapAgent |
jackson序列化 | 自定义序列化器 BaseEnumSerializer.java | 解决参数枚举的序列化问题 |
logback钉钉通知 | 自定义Appender LogbackDingTalkAppender.java | Error消息及时通知 |
logback邮件通知 | 默认支持 | Error异常及时通知 |
全局异常捕获 | GlobalExceptionHandler.java | 捕获异常 |
数据库字段加解密 | 参考CustomTypeHandler | 给部分数据库字段加解密 |
执行初始化SQL语句 | 自动建表 | |
MybatisPlus的SQL脚本自动维护 | https://baomidou.com/pages/1812u1/ | 自动建表 |
SpringBoot 3.0 声明式API远程调用 | 参考 RemoteApi | |
参数全局trim() | StringTrimDeserializer | 避免异常数据 |
Long类型超长转String | BaseLongSerializer.java | 解决前端无法正确显示超长String |
前端null传到后端成"null"字符串 | StringToStringConverter | 解决字符串"null"等问题 |
敏感信息从程序外配置文件读取 | RemoteEnvironmentPostProcessor.java 极海的方案 DataSourceConfigLoader.java | 从程序外的配置文件读取数据库的账号密码信息 |
单元测试默认配置环境 | @ActiveProfiles("test") | 解决每次修改yaml文件的烦恼 |
具体框架如下表:
这个针对的是Jetbrains Runtime ,所以其他JDK慎重。实际测试jdk17 21都可以正常运行。
https://github.com/HotswapProjects/HotswapAgent
-XX:+AllowEnhancedClassRedefinition -XX:HotswapAgent=fatjar
注意需要在debug模式下启动才能生效。
修改代码后,Build -> Rebuild Project (Ctrl + Shift + F9) 重新编译和加载修改的类文件即可生效。
http://blog.houxiaoyi.cn/#/src/Java/%E7%83%AD%E5%8A%A0%E8%BD%BD
有两种方案。一种借助与mybatis-plus 另一种就是mybatis的
hxy.dream.common.init.ApplicationStartupRunner
https://www.baomidou.com/pages/226c21/#%E9%85%8D%E7%BD%AE
# 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
hxy.dream.common.init.MysqlDdl
推荐 RestTemplate或者WebClient
WebClient 声明式的API调用: RemoteApiConfig
eric-dream
├── app --微服务注册与发现中心
├── common -- 微服务系统管理与调试
├── manager -- 第三方服务调用
├── entity -- 实体
├── common -- 公共,配置文件,脚手架等
└── dao -- 数据持久层
上面后缀server是服务治理模块。platform是业务应用模块。 微服务=分布式开发+服务治理
https://github.com/GradleCN/GradleSide
如果IDEA自动下载gradle很慢。那么可以先提前安装好gradle,然后指定下安装目录即可。
腾讯的代理镜像
https://mirrors.cloud.tencent.com/gradle/gradle-7.5.1-bin.zip
https://services.gradle.org/distributions/gradle-7.4-bin.zip
https://spring.io/projects/spring-boot#support
./gradlew clean bootJar -x test
./gradlew bootRun -x test
./gradlew dependencyInsight --dependency mybatis
并行构建
gradle build -x test --parallel --build-cache
需要解决多工程的依赖分析
api project(':dao')
以下是 gradle6前后的使用方式:
// implementation的依赖是不可以传递的而,entity需要被app依赖,所以需要加上
// implementation project(':entity') /* 子模块之间的依赖 */
compile project(':entity') /* 子模块之间的依赖 */
google出品的一个插件,可以直接将SpringBoot构建推送到Docker仓库
id "com.google.cloud.tools.jib" version "2.0.0"
https://mp.weixin.qq.com/s/qhG9T0VdW4VkVy2VJJmftg
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给前端展示即可。
https://juejin.im/post/6844904196693557255 统一序列化的核心在于重写序列化器。但是粒度就需要好好控制了,是序列化所有的枚举类,还是只处理自己写的枚举类。 本项目是只处理自己写的枚举类,其方式是让所有自己写的枚举必须实现统一的BaseEnum接口。在一些团队合作的大项目里, 可能这种规范并不会被所有人认可,所以也可以用限制包的方式,自己配置指定包的枚举可以被统一处理。
现在的问题在于jackson将枚举反序列化的时候需要使用code而不是ordinal。显然之前的Convert在这里貌似并没有什么作用。因为这里基本上全部靠jackson来序列化。
如果发生无法正常解析的时候,那么可能是注入的bean无法使用
如果发现注入的bean无法解决json序列化问题,那么可以在BaseEnum
加上这个注解
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
通过上面方法,对数据库层和Controller层的转换操作,可以很好的处理枚举在应用中的形态,程序中可以很好的使用枚举了。
https://blog.csdn.net/bandancer/article/details/84926383
基于fastjson在mvc中解决enum类型序列化反序列化
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.
这个可以去掉满屏的try catch
,还可以结合事务。
https://blog.csdn.net/qq_27127145/article/details/85775240
MybatisPlus数据库加解密 参考CustomTypeHandler
来自 《阿里巴巴Java开发规范》
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。