常见问题
常见问题
1、id精度丢失
此项目目前使用的是雪花算法生成id,可能导致前端页面获取丢失精度(感谢【luoheyu】提供测试意见)
方案1:处理长度过长的Long类型
只处理长度过长的Long类型,前端页面就不会丢失精度了 (感谢【Colin】提供解决方案)
创建一个BigNumberSerializer(用来处理超过JS数据范围的Long类型)
/**
* 超出 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<? extends Number> 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配置全局序列化(针对所有属性),一下两种方式任选其一
@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);
};
}
// 方式二
@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);
}
}
方案2:序列化所有long类型
方案3:通过yml配置
通过设置id生成器类型,修改id生成方式
# warm-flow工作流配置
warm-flow:
# id生成器类型, 不填默认为orm扩展自带生成器或者warm-flow内置的19位雪花算法, SnowId14:14位,SnowId15:15位, SnowFlake19:19位
key_type: SnowId19
方案4:自定义id生成策略
参照如下文章,继承填充器接口,修改id生成方式
Warm-Flow工作流引擎数据库主键自增策略实现
2、流程图片中文乱码
linux环境:安装中文字体
生成的流程图中文乱码或者报错InternalError; java.lang.reflect,InvocationTargetException
由于服务器上缺少中文字体,通过检查fc-list :lang=zh是否包含中文字符集(以下是存在的示例)
[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
将文件解压至/usr/share/fonts目录下,如果还不行,添加到jre的lib/fonts目录(感谢【我们好像在哪儿见过
】提供的方案)
[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
重启服务
docker环境:安装中文字体
以ruoyi-vue-plus-4.x中dockerfile为例,添加中文字体即可 (感谢【格调@main】提供的方案)
3、FlowAutoConfig.initFlow()未加载
spring开启懒加载后,导致FlowAutoConfig.initFlow()未加载。(由社区【星 Q】提供)
删除"lazy-initialization: true",可解决问题,以下是错误示例
spring:
main:
allow-bean-definition-overriding: true
lazy-initialization: true
web-application-type: servlet
4、监听器未执行或者类型转换异常
热部署插件jrebel或者devtools导致问题,检查是否使用热部署插件,比如spring.devtools,可以把插件关了,或者加上排除配置spring-devtools.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增加依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
4、MyBatisConfig.java注释掉,新增MybatisPlusConfig
点击查看代码
package com.ruoyi.framework.config;
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.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* Mybatis Plus 配置
*
* @author ruoyi
*/
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor(paginationInnerInterceptor());
// 乐观锁插件
interceptor.addInnerInterceptor(optimisticLockerInnerInterceptor());
// 阻断插件
interceptor.addInnerInterceptor(blockAttackInnerInterceptor());
return interceptor;
}
/**
* 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html
*/
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 设置数据库类型为mysql
paginationInnerInterceptor.setDbType(DbType.MYSQL);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInnerInterceptor.setMaxLimit(-1L);
return paginationInnerInterceptor;
}
/**
* 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html
*/
public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
return new OptimisticLockerInnerInterceptor();
}
/**
* 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html
*/
public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
return new BlockAttackInnerInterceptor();
}
}
5、ruoyi-admin的application.yml中配置mybatis改为mybatis-plus
6、导入依赖包失败
6.1、可尝试切换maven版本 (感谢【一拳打爆常大宝】)
如maven3.9.6切换为低版本3.8.2
7、 StackOverflowError 错误
查看跳转线退回的,是否设置为退回类型,后续有时间再做校验