From 1d7924669b2c6341beac7f4277eeb51eb210dbb6 Mon Sep 17 00:00:00 2001 From: colin Date: Wed, 11 Sep 2024 17:49:50 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E9=9B=85=E7=89=88=E5=A4=84=E7=90=86?= =?UTF-8?q?=E8=B6=85=E8=BF=87=E7=B2=BE=E5=BA=A6=E7=9A=84Long=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=EF=BC=8C=E5=8F=AA=E5=A4=84=E7=90=86=E8=B6=85=E8=BF=87?= =?UTF-8?q?=E7=B2=BE=E5=BA=A6=E7=9A=84Long=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/troubleshooting.md | 144 +++++++++++++++++++++++++++------- 1 file changed, 117 insertions(+), 27 deletions(-) diff --git a/src/common/troubleshooting.md b/src/common/troubleshooting.md index 8e9c3f2..f5de43b 100644 --- a/src/common/troubleshooting.md +++ b/src/common/troubleshooting.md @@ -1,43 +1,131 @@ # 常见问题 -## 1、id精度丢失 -此项目目前使用的是雪花算法生成id,可能导致前端页面获取丢失精度(感谢【luoheyu】提供测试意见) -**第一个方案:** -按照这个把long序列化成字符串,前端页面就不会丢失精度 -[如何处理Long类型精度丢失问题](http://doc.ruoyi.vip/ruoyi/other/faq.html#%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86long%E7%B1%BB%E5%9E%8B%E7%B2%BE%E5%BA%A6%E4%B8%A2%E5%A4%B1%E9%97%AE%E9%A2%98) +## 1、id精度丢失 -**第二个方案:** -通过设置id生成器类型,修改id生成方式 -```yml -# warm-flow工作流配置 -warm-flow: - # id生成器类型, 不填默认19位雪花算法, SnowId14:14位,SnowId15:15位, SnowFlake19:19位 - key_type: SnowId19 -``` +此项目目前使用的是雪花算法生成id,可能导致前端页面获取丢失精度(感谢【luoheyu】提供测试意见) +**第一个方案:** +按照这个把long序列化成字符串,前端页面就不会丢失精度了,获取查看hh-vue项目如何处理 -**第三个方案:** -参照如下文章,继承填充器接口,修改id生成方式 +- 优雅版(推荐)只处理超过精度的Long类型 + - 创建一个BigNumberSerializer(用来处理超过JS数据范围的Long类型) + ```java + /** + * 超出 JS 最大最小值 处理 + */ + @JacksonStdImpl + public class BigNumberSerializer extends NumberSerializer { + + /** + * 根据 JS Number.MAX_SAFE_INTEGER 与 Number.MIN_SAFE_INTEGER 得来 + */ + private static final long MAX_SAFE_INTEGER = 9007199254740991L; + private static final long MIN_SAFE_INTEGER = -9007199254740991L; + + /** + * 提供实例 + */ + public static final BigNumberSerializer INSTANCE = new BigNumberSerializer(Number.class); + + public BigNumberSerializer(Class rawType) { + super(rawType); + } + + @Override + public void serialize(Number value, JsonGenerator gen, SerializerProvider provider) throws IOException { + // 超出范围 序列化位字符串 + if (value.longValue() > MIN_SAFE_INTEGER && value.longValue() < MAX_SAFE_INTEGER) { + super.serialize(value, gen, provider); + } else { + gen.writeString(value.toString()); + } + } + } + ``` + - 添加JacksonConfig配置全局序列化(针对所有属性) + - 以Jackson2ObjectMapperBuilderCustomizer为例 + ```java + @Configuration + public class JacksonConfig { + + + @Bean + public Jackson2ObjectMapperBuilderCustomizer customizer() { + return builder -> { + + ... 其他配置.... + + ... 其他配置.... + + JavaTimeModule javaTimeModule = new JavaTimeModule(); + + //Long,BigInteger 转为 String 防止 js 丢失精度 + javaTimeModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); + javaTimeModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); + javaTimeModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); + + builder.modules(javaTimeModule); + }; + } + } + ``` + - 其他方式 + ```java + @Configuration + public class JacksonConfig { + + @Bean + public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() { + final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); + final ObjectMapper objectMapper = builder.build(); + ... 其他配置.... + + ... 其他配置.... + + SimpleModule simpleModule = new SimpleModule(); + // Long,BigInteger 转为 String 防止 js 丢失精度 + simpleModule.addSerializer(Long.class, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(Long.TYPE, BigNumberSerializer.INSTANCE); + simpleModule.addSerializer(BigInteger.class, BigNumberSerializer.INSTANCE); + objectMapper.registerModule(simpleModule); + + return new MappingJackson2HttpMessageConverter(objectMapper); + } + } + ``` +- 普通版 + http://doc.ruoyi.vip/ruoyi/other/faq.html#%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86long%E7%B1%BB%E5%9E%8B%E7%B2%BE%E5%BA%A6%E4%B8%A2%E5%A4%B1%E9%97%AE%E9%A2%98 +
+ +**第二个方案:** +参照如下文章,继承填充器接口,修改id生成方式 [Warm-Flow工作流引擎数据库主键自增策略实现](https://juejin.cn/post/7402110528298074152) ## 2、流程图片中文乱码 + 生成的流程图中文乱码或者报错InternalError; java.lang.reflect,InvocationTargetException 由于服务器上缺少中文字体,通过检查fc-list :lang=zh是否包含中文字符集(以下是存在的示例) + ```shell [root@iZbp18ilgi6s1lkbmmfo2jZ zhFonts]# fc-list :lang=zh /usr/share/fonts/zhFonts/SIMSUN.TTC: 新宋体,NSimSun:style=常规,Regular /usr/share/fonts/zhFonts/SIMSUN.TTC: 宋体,SimSun:style=常规,Regular ``` -[zhFonts.zip](https://gitee.com/warm_4/warm-flow-doc/blob/main/file/zhFonts.zip)将文件解压至/usr/share/fonts目录下,如果还不行,添加到jre的lib/fonts目录(感谢【我们好像在哪儿见过 + +[zhFonts.zip](https://gitee.com/warm_4/warm-flow-doc/blob/main/file/zhFonts.zip) +将文件解压至/usr/share/fonts目录下,如果还不行,添加到jre的lib/fonts目录(感谢【我们好像在哪儿见过 】提供的方案) + ```shell [root@iZbp18ilgi6s1lkbmmfo2jZ fonts]# ll 总用量 8 drwxr-xr-x 2 root root 4096 5月 17 00:20 dejavu drwxr-xr-x 2 root root 4096 5月 17 11:40 zhFonts ``` + 重启服务 ## 3、FlowAutoConfig.initFlow()未加载 + spring开启懒加载后,导致FlowAutoConfig.initFlow()未加载。(由社区【^星^ Q】提供) 删除"lazy-initialization: true",可解决问题,以下是错误示例 @@ -50,15 +138,19 @@ spring: ``` ## 4、监听器未执行或者类型转换异常 + 热部署插件jrebel或者devtools导致问题,检查是否使用热部署插件,比如spring.devtools,可以把插件关了,或者加上排除配置spring-devtools.properties + ```properties restart.include.flow=/io.github.minliuhua.*.jar ``` ## 5、hh-vue切换mybaits-plus + 1、根pom.xml,warm-flow-mybatis-sb-starter改为warm-flow-mybatis-plus-sb-starter 2、ruoyi-flow的pom.xml,warm-flow-mybatis-sb-starter改为warm-flow-mybatis-plus-sb-starter 3、ruoyi-common增加依赖 + ```java com.baomidou @@ -66,6 +158,7 @@ restart.include.flow=/io.github.minliuhua.*.jar 3.5.1 ``` + 4、MyBatisConfig.java注释掉,新增MybatisPlusConfig
点击查看代码 @@ -89,11 +182,9 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; */ @EnableTransactionManagement(proxyTargetClass = true) @Configuration -public class MybatisPlusConfig -{ +public class MybatisPlusConfig { @Bean - public MybatisPlusInterceptor mybatisPlusInterceptor() - { + public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); // 分页插件 interceptor.addInnerInterceptor(paginationInnerInterceptor()); @@ -107,8 +198,7 @@ public class MybatisPlusConfig /** * 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html */ - public PaginationInnerInterceptor paginationInnerInterceptor() - { + public PaginationInnerInterceptor paginationInnerInterceptor() { PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(); // 设置数据库类型为mysql paginationInnerInterceptor.setDbType(DbType.MYSQL); @@ -120,16 +210,14 @@ public class MybatisPlusConfig /** * 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html */ - public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() - { + public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() { return new OptimisticLockerInnerInterceptor(); } /** * 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html */ - public BlockAttackInnerInterceptor blockAttackInnerInterceptor() - { + public BlockAttackInnerInterceptor blockAttackInnerInterceptor() { return new BlockAttackInnerInterceptor(); } } @@ -138,8 +226,10 @@ public class MybatisPlusConfig
-5、ruoyi-admin的application.yml中配置mybatis改为mybatis-plus +5、ruoyi-admin的application.yml中配置mybatis改为mybatis-plus ## 6、导入依赖包失败 + ### 6.1、可尝试切换maven版本 (感谢【一拳打爆常大宝】) + 如maven3.9.6切换为低版本3.8.2 \ No newline at end of file -- Gitee