gpt4 book ai didi

spring-boot - 无法将Redis值反序列化为Java Pojo

转载 作者:行者123 更新时间:2023-12-03 06:42:35 30 4
gpt4 key购买 nike

这是我的redis配置

@Configuration
public class RedisConfig {

@Bean
JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("localhost", 6379);
// redisStandaloneConfiguration.setPassword(RedisPassword.of("password"));
return new JedisConnectionFactory(redisStandaloneConfiguration);
}

@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
/**
* Configure your redisTemplate
* StringRedisTemplate Use String RedisSerializer to serialize by default
* RedisTemplate By default, use JdkSerialization RedisSerializer to serialize
*/
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);

//Turn on the default type
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//Set date format
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();

return redisTemplate;
}
}

这是我的模特
@Data
@AllArgsConstructor
public class User{

private String id;
private String name;
private List<Hobby> hobbies;

public User() {};
}

@Data
@AllArgsConstructor
public class Hobby {

private String name;

public Hobby() {};
}

这是我的redis仓库
@Repository
public class RedisUserRepository {

private HashOperations hashOperations;

private RedisTemplate redisTemplate;

public RedisUserRepository(RedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
this.hashOperations = this.redisTemplate.opsForHash();
}

public void save(String hash, User user) {
hashOperations.put(hash, user.getId(), user);
}

public User findById(String hash, String id) {
User o = (User) hashOperations.get(hash, id);
return o;
}
}

当我运行它时,我能够保存user1。
@Override
public void run(String... args) throws Exception {
List<Hobby> hobbies = new ArrayList<Hobby>() {{
add(new Hobby("cricket"));
add(new Hobby("dancing"));
}};

User user1 = new User("2def", "Bob", hobbies);
this.redisUserRepository.save("USER", user1);

# ERROR HERE RETRIEVING!
User retrieved = this.redisUserRepository.findById("USER", "2def");
}

但是,当我从redis检索对象时,它会抛出
    Caused by: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.testproject.InMemory.InMemoryApplication$1` (no Creators, like default construct, exist): no default no-arguments constructor found
at [Source: (byte[])"["com.testproject.InMemory.model.User",{"id":"2def","name":"Bob","hobbies":["com.testproject.InMemory.InMemoryApplication$1",[["com.testproject.InMemory.model.Hobby",{"name":"cricket"}],["com.testproject.InMemory.model.Hobby",{"name":"dancing"}]]]}]"; line: 1, column: 126] (through reference chain: com.testproject.InMemory.model.User["hobbies"])
at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1589) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1055) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.ValueInstantiator.createUsingDefault(ValueInstantiator.java:189) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createUsingDefault(StdValueInstantiator.java:267) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.createDefaultInstance(CollectionDeserializer.java:255) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:27) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:120) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromArray(AsArrayTypeDeserializer.java:53) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserializeWithType(CollectionDeserializer.java:314) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:138) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer._deserialize(AsArrayTypeDeserializer.java:120) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.jsontype.impl.AsArrayTypeDeserializer.deserializeTypedFromAny(AsArrayTypeDeserializer.java:71) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.std.UntypedObjectDeserializer$Vanilla.deserializeWithType(UntypedObjectDeserializer.java:712) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.deser.impl.TypeWrappedDeserializer.deserialize(TypeWrappedDeserializer.java:68) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4202) ~[jackson-databind-2.10.2.jar:2.10.2]
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3309) ~[jackson-databind-2.10.2.jar:2.10.2]
at org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer.deserialize(Jackson2JsonRedisSerializer.java:73) ~[spring-data-redis-2.2.6.RELEASE.jar:2.2.6.RELEASE]
... 25 common frames omitted

我无法反序列化“爱好列表”。我该如何解决?如果我的用户类别中没有列表爱好,则该代码可以正常工作。

-编辑-
我的pom.xml如下。我正在使用Spring Boot 2.2.6-RELEASE。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.10.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

最佳答案

匿名ArrayList可能是您的问题。代替:

List<Hobby> hobbies = new ArrayList<Hobby>() {{
add(new Hobby("cricket"));
add(new Hobby("dancing"));
}};

尝试:
List<Hobby> hobbies = new ArrayList<Hobby>();
hobbies.add(new Hobby("cricket"));
hobbies.add(new Hobby("dancing"));

关于spring-boot - 无法将Redis值反序列化为Java Pojo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61357684/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com