Java ObjectMapper Redis序列化问题
我正在尝试缓存这样的实体:Java ObjectMapper Redis序列化问题,java,redis,jackson,Java,Redis,Jackson,我正在尝试缓存这样的实体: class Foo { String attr1; Set<Long> attr2; Set<Long> attr3; } { "attr1": "123456789", "attr2": [ "java.util.HashSet", [ [ "java.lang.Long&qu
class Foo {
String attr1;
Set<Long> attr2;
Set<Long> attr3;
}
{
"attr1": "123456789",
"attr2": [
"java.util.HashSet",
[
[
"java.lang.Long",
1
],
[
"java.lang.Long",
2
],
[
"java.lang.Long",
3
]
]
],
"attr3": [
"java.util.HashSet",
[]
]
}
但当尝试从redis读回时,我的代码失败,出现以下异常:
org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class java.lang.Object
at [Source: (byte[])"{"attr1":"123456789","attr2":["java.util.HashSet",[["java.lang.Long",1],["java.lang.Long",2],["java.lang.Long",3]]],"attr3":["java.util.HashSet",[]]}"; line: 1, column: 1]; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class java.lang.Object
at [Source: (byte[])"{"attr1":"123456789","attr2":["java.util.HashSet",[["java.lang.Long",1],["java.lang.Long",2],["java.lang.Long",3]]],"attr3":["java.util.HashSet",[]]}"; line: 1, column: 1]
at org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer.deserialize(GenericJackson2JsonRedisSerializer.java:152)
at org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer.deserialize(GenericJackson2JsonRedisSerializer.java:130)
at org.springframework.data.redis.serializer.DefaultRedisElementReader.read(DefaultRedisElementReader.java:49)
at org.springframework.data.redis.serializer.RedisSerializationContext$SerializationPair.read(RedisSerializationContext.java:272)
at org.springframework.data.redis.cache.RedisCache.deserializeCacheValue(RedisCache.java:280)
at org.springframework.data.redis.cache.RedisCache.lookup(RedisCache.java:94)
at org.springframework.cache.support.AbstractValueAdaptingCache.get(AbstractValueAdaptingCache.java:58)
at org.springframework.cache.interceptor.AbstractCacheInvoker.doGet(AbstractCacheInvoker.java:73)
at org.springframework.cache.interceptor.CacheAspectSupport.findInCaches(CacheAspectSupport.java:571)
at org.springframework.cache.interceptor.CacheAspectSupport.findCachedItem(CacheAspectSupport.java:536)
at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:402)
at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:345)
at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:64)
如果从ObjectMapper中删除默认类型,异常将更改为:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.foo.Foo
at com.sun.proxy.$Proxy190.findByAuuid(Unknown Source)
at com.foo.FooService.getFoo(FooServiceImpl.java:80)
at com.foo.FooService.getFooImpl$$FastClassBySpringCGLIB$$349e7f48.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
java.lang.ClassCastException:java.util.LinkedHashMap不能强制转换为com.foo.foo
位于com.sun.proxy.$Proxy190.findByAuuid(未知源)
在com.foo.FooService.getFoo(FooServiceImpl.java:80)
在com.foo.FooService.getFooImpl$$FastClassBySpringCGLIB$$349e7f48.invoke()上
位于org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
我应该怎么做才能将其反序列化而不会出现问题
短暂性脑缺血发作
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.foo.Foo
at com.sun.proxy.$Proxy190.findByAuuid(Unknown Source)
at com.foo.FooService.getFoo(FooServiceImpl.java:80)
at com.foo.FooService.getFooImpl$$FastClassBySpringCGLIB$$349e7f48.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)