安全并彻底关闭“WARNING: Illegal reflective access by org.nustaq.serialization.FSTClazzInfo”

开发项目中用到reids,每次启动都会有这种warning,虽然不影响程序继续执行,但是看上去很烦人,

而且运维还以为是程序有毛病

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.nustaq.serialization.FSTClazzInfo (file:/gradle_user_home/caches/modules-2/files-2.1/de.ruedigermoeller/fst/2.57/70583ffcab07a0c756428811dd108a342b575d2e/fst-2.57.jar) to field java.lang.String.value
WARNING: Please consider reporting this to the maintainers of org.nustaq.serialization.FSTClazzInfo
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

网上搜索很久,基本没有好的方法,大多让加参数忽略warning警告,这个其实很不安全,或许会错过重要的warning

有人让选不同fst版本测试看看,这样不断破坏了原本redission的依赖,好像也没什么效果

最后自食其力,自行解决啦

 

讲重点

之所以有开头的warning,是因为redission默认code用的是jackson依赖fst

fst有问题,咱们不用他就行啦

序列化的选择有很多,选择避开fst:

编码类名称	说明
org.redisson.codec.JsonJacksonCodec	Jackson JSON 编码 默认编码
org.redisson.codec.AvroJacksonCodec	Avro 一个二进制的JSON编码
org.redisson.codec.SmileJacksonCodec	Smile 另一个二进制的JSON编码
org.redisson.codec.CborJacksonCodec	CBOR 又一个二进制的JSON编码
org.redisson.codec.MsgPackJacksonCodec	MsgPack 再来一个二进制的JSON编码
org.redisson.codec.IonJacksonCodec	Amazon Ion 亚马逊的Ion编码,格式与JSON类似
org.redisson.codec.KryoCodec	Kryo 二进制对象序列化编码
org.redisson.codec.SerializationCodec	JDK序列化编码
org.redisson.codec.FstCodec	FST 10倍于JDK序列化性能而且100%兼容的编码
org.redisson.codec.LZ4Codec	LZ4 压缩型序列化对象编码
org.redisson.codec.SnappyCodec	Snappy 另一个压缩型序列化对象编码
org.redisson.client.codec.JsonJacksonMapCodec	基于Jackson的映射类使用的编码。可用于避免序列化类的信息,以及用于解决使用byte[]遇到的问题。
org.redisson.client.codec.StringCodec	纯字符串编码(无转换)
org.redisson.client.codec.LongCodec	纯整长型数字编码(无转换)
org.redisson.client.codec.ByteArrayCodec	字节数组编码
org.redisson.codec.CompositeCodec	用来组合多种不同编码在一起

甚至还可以自己fastjson来实现:

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.ByteBufInputStream;
import io.netty.buffer.ByteBufOutputStream;
import org.redisson.client.codec.BaseCodec;
import org.redisson.client.protocol.Decoder;
import org.redisson.client.protocol.Encoder;
​
import java.io.IOException;
​
public class FastjsonCodec extends BaseCodec {
​
 private final Encoder encoder = in -> {
 ByteBuf out = ByteBufAllocator.DEFAULT.buffer();
 try {
 ByteBufOutputStream os = new ByteBufOutputStream(out);
 JSON.writeJSONString(os, in,SerializerFeature.WriteClassName);
 return os.buffer();
 } catch (IOException e) {
 out.release();
 throw e;
 } catch (Exception e) {
 out.release();
 throw new IOException(e);
 }
 };
​
 private final Decoder<Object> decoder = (buf, state) ->
 JSON.parseObject(new ByteBufInputStream(buf), Object.class);
​
 @Override
 public Decoder<Object> getValueDecoder() {
 return decoder;
 }
​
 @Override
 public Encoder getValueEncoder() {
 return encoder;
 }
}

上面fastjson版本来自网络,我没有测试,如果您需要请自行验证

 

我大多数用字符串,所以我选择用

org.redisson.client.codec.StringCodec

 

最后说下具体怎么操作:

1,排除redission中的fst包

exclude group: 'de.ruedigermoeller', module: 'fst'

2,修改redission的配置文件,加入:

config.setCodec(new org.redisson.client.codec.StringCodec());

3,刷新gradle或者maven,重新构建项目

 

再次运行项目,就没有烦人的warning啦

 

 

 

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章