报错信息:2024-01-29 10:33:18.864 [basic-meet,,] [main] ERROR .redis. - redissionClient init error
2024-01-29 10:33:18.868 [basic-meet,,] [main] ERROR - Unable to make field private final byte[] accessible: module does not "opens " to unnamed module @202b0582
: Unable to make field private final byte[] accessible: module does not "opens " to unnamed module @202b0582
原因:
在JDK 9及以后的版本中,Java引入了模块化系统,其中一些内部API,如的
value
字段,现在变得不可直接访问。这是为了增强Java平台的安全性和稳定性。
当你尝试使用反射来访问这些字段时,就会遇到你所描述的错误。错误信息表明,你正在尝试访问的字段()在
模块中,而该模块并未对一个名为“unnamed module”的模块开放。redisson的FSTClazzInfo 类
protected createFieldInfo(Field field) { FieldKey key = null; if ( != null) { key = new FieldKey((), ()); res = ()(key); if (res != null) { (); return res; } } (true); Predict predict = ? null : (Predict)(); result = new (predict != null ? () : null, field, ); if ( != null && key != null) { (key, result); } (); return result; } 设置反射私有自动访问权限(true),jdk17 会调用checkCanSetAccessible抛出异常。
解决方案:
-
升级redisson包:
<dependency> <groupId></groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.23.1</version> </dependency> ,3.23.1使用Kryo5Codec通过ClassLoader在通过流获取。测试启动成功
-
使用
--add-opens
JVM参数:如果你确实需要使用反射来访问这些字段,你可以在启动JVM时使用--add-opens
参数来打开特定的模块。java --add-opens /=ALL-UNNAMED -jar your_application.jar。不建议,这种解决方案可能存在潜在的安全风险,因为它打开了一个本来是受保护的模块,允许其他模块进行未经授权的访问。因此,建议在必要时使用此选项,同时确保您的应用程序没有潜在的漏洞和安全问题。。