使用j2cache时,缓存数据报如下错误,怎么解决?
java.lang.RuntimeException: cannot support legacy JDK serialization methods in crossplatform mode. Define a serializer for this class java.sql.Timestamp
at org.nustaq.serialization.FSTClazzInfo.<init>(FSTClazzInfo.java:176) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTClazzInfoRegistry.getCLInfo(FSTClazzInfoRegistry.java:129) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.getFstClazzInfo(FSTObjectOutput.java:534) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.writeObjectWithContext(FSTObjectOutput.java:416) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.writeObjectInternal(FSTObjectOutput.java:327) ~[fst-2.57.jar:na]
at org.nustaq.serialization.serializers.FSTMapSerializer.writeObject(FSTMapSerializer.java:49) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.writeObjectWithContext(FSTObjectOutput.java:476) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.writeObjectInternal(FSTObjectOutput.java:327) ~[fst-2.57.jar:na]
at org.nustaq.serialization.serializers.FSTCollectionSerializer.writeObject(FSTCollectionSerializer.java:54) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.writeObjectWithContext(FSTObjectOutput.java:476) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.writeObjectWithContext(FSTObjectOutput.java:369) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.writeObjectFields(FSTObjectOutput.java:664) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.defaultWriteObject(FSTObjectOutput.java:546) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.writeObjectWithContext(FSTObjectOutput.java:458) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.writeObjectInternal(FSTObjectOutput.java:327) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.writeObject(FSTObjectOutput.java:285) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTObjectOutput.writeObject(FSTObjectOutput.java:204) ~[fst-2.57.jar:na]
at org.nustaq.serialization.FSTConfiguration.asByteArray(FSTConfiguration.java:1182) ~[fst-2.57.jar:na]
at net.oschina.j2cache.util.FstJSONSerializer.serialize(FstJSONSerializer.java:57) ~[j2cache-core-2.5.1-release.jar:na]
at net.oschina.j2cache.util.SerializationUtils.serialize(SerializationUtils.java:78) ~[j2cache-core-2.5.1-release.jar:na]
at net.oschina.j2cache.Level2Cache.put(Level2Cache.java:172) ~[j2cache-core-2.5.1-release.jar:na]
at net.oschina.j2cache.CacheChannel.set(CacheChannel.java:290) ~[j2cache-core-2.5.1-release.jar:na]
at net.oschina.j2cache.CacheChannel.set(CacheChannel.java:265) ~[j2cache-core-2.5.1-release.jar:na]
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
遇到这个错误是因为J2Cache在使用FST (Fast Serializing Toolkit) 库进行序列化时,不支持Java的原生JDK序列化方法(即java.sql.Timestamp
类),尤其是在跨平台模式下。为了解决这个问题,你需要为java.sql.Timestamp
类定义一个自定义的序列化器(Serializer)。
下面是解决步骤:
java.sql.Timestamp
创建一个FST兼容的序列化器和反序列化器。这里是一个简单的示例:import java.io.IOException;
import java.sql.Timestamp;
import org.nustaq.serialization.FSTObjectInput;
import org.nustaq.serialization.FSTObjectOutput;
import org.nustaq.serialization.FSTSerializable;
public class TimestampSerializer implements FSTSerializable {
@Override
public void writeObject(FSTObjectOutput out) throws IOException {
// 将Timestamp转换为long值进行序列化
out.writeLong(((Timestamp) this).getTime());
}
@Override
public void readObject(FSTObjectInput in) throws IOException, ClassNotFoundException {
// 从输入流中读取long值并构造Timestamp对象
long time = in.readLong();
this.setTime(time); // 注意这里的`this`需要替换为实际的对象实例
}
}
注意:上述代码中的this.setTime(time)
是示意性的,实际上你可能需要创建一个新的Timestamp
实例来设置时间。
import net.oschina.j2cache.CacheBuilder;
import net.oschina.j2cache.J2CacheBuilder;
import org.nustaq.serialization.FSTConfiguration;
import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class J2CacheConfig {
@Bean
public CacheManager cacheManager() {
FSTConfiguration conf = FSTConfiguration.createDefaultConfiguration();
// 注册自定义序列化器
conf.registerSerializer(Timestamp.class, new TimestampSerializer());
J2CacheBuilder builder = new J2CacheBuilder();
// 设置其他配置...
builder.configFromEnv(); // 或者手动配置其他参数
builder.serializeWith(conf);
return builder.build();
}
}
java.sql.Timestamp
的问题。请根据你的具体环境调整上述代码片段。如果还有其他类也遇到了类似问题,可以按照同样的方式为它们创建并注册序列化器。