user1555190
user1555190

Reputation: 3243

Redis spring - JSON:Cannot construct instance of

I have the following class

@NoArgsConstructor
@Data
public class MainList implements Serializable {

    private static final long serialVersionUID = 5679734271483606796L;

    @Id
    private String id;
    private List<Category> categories;
}

@Builder
@Getter
@EqualsAndHashCode
@ToString
public class Category {
    private String category;
    private String description;
    private List<Data> data;
}

@Builder
@Getter
@EqualsAndHashCode
@ToString
public class Data {
    private int dataId;
    @JsonIgnore
    private Map<String, String> names;
    private String name;
}

Request processing failed:

org.springframework.data.redis.serializer.SerializationException: Could not read JSON:Cannot construct instance of `com.domain.Category` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
 at [Source: (byte[])"{"@class":"com.domain.MainList","id":"1245","categories":["java.util.ArrayList",[{"@class":"com.adapter.domain.Category","category":"","data":["java.util.ArrayList",[{"@class":"com.domain.Category$Data”,”dataId":83683,"description":"##########################"},{"@class":"com.domain.Category$Data”,”dataId”:77124,"description":"##############################"},{"@class":"com.hollandandbar"[truncated 5674445 bytes]; line: 1, column: 180] (through reference chain: com.domain.MainList["categories"]->java.util.ArrayList[0]) ] with root cause
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.domain.Category` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

REdisTemplate set up

final var objectMapper = new Jackson2ObjectMapperBuilder().failOnEmptyBeans(false)
        .failOnUnknownProperties(false)
        .indentOutput(false)
        .serializationInclusion(JsonInclude.Include.NON_NULL)
        .modules(new JavaTimeModule())
        .build();

objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(),
        ObjectMapper.DefaultTyping.EVERYTHING,
        JsonTypeInfo.As.PROPERTY);

final var genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(objectMapper);
final RedisSerializer<String> stringRedisSerializer = new StringRedisSerializer();

RedisTemplate<String, MainList> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(genericJackson2JsonRedisSerializer);

Any ideas?

Upvotes: 0

Views: 24

Answers (1)

user1555190
user1555190

Reputation: 3243

fixed by annotating with the following

@NoArgsConstructor
@AllArgsConstructor

Upvotes: 1

Related Questions