Spring Data Redis: десериализация - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть класс разных типов данных.Одним из них является Map из Integer ключей и значений массива int (в нем 24 ячейки).Я храню класс в Redis, используя Spring Data, но когда я получаю его от Redis, он выдает следующую ошибку:

Это карта:

Map<Integer, int[]> mymap = new Hashmap<>();

Это ошибка:

org.springframework.data.mapping.MappingException: Problem deserializing 'setterless' property ("mymap"): no way to handle typed deser with setterless yet

Есть ли другой способ сериализации и десериализации mymap?Или я должен подумать о других способах хранения этой переменной?

Отредактировано:

Это мой класс:

private String word;
private int DF;
private boolean NE;
private double mean;
private Map<Integer, Burst> interal = new HashMap<>();
private Map<String, Date> docs = new HashMap<>();
private Map<Integer, int[]> TWF;

И это мой конфиг redis:

public class redisConfig {
@Primary
@Bean("rediscf1")
JedisConnectionFactory jedisConnectionFactory1() {
    RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("localhost", 6379);
    redisStandaloneConfiguration.setDatabase(0);

    return new JedisConnectionFactory(redisStandaloneConfiguration, new JedisConfig());
}


@Primary
@Bean(name = "redis1")
public RedisTemplate<String, Object> redisTemplate1(@Qualifier("rediscf1") JedisConnectionFactory cf) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(cf);
    return template;
}}

1 Ответ

0 голосов
/ 27 апреля 2018

Моя конфигурация Redis:

@Bean
JedisConnectionFactory jedisConnectionFactory() {
    RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("localhost", 6379);
    return new JedisConnectionFactory(redisStandaloneConfiguration);
}

@Bean
public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory cf) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(cf);
    return template;
}

(я предлагаю изменить здесь Object на класс вашего класса сущности для сохранения)

Далее у меня есть два класса.Entity для сохранения и TestClass, как ваш класс "Burst".Не забудьте добавить во все классы сохранения реализует Сериализуемый .

public class TestEntity implements Serializable {
    private String id;
    private Map<Integer, TestClass> interal = new HashMap<>();
    private Map<Integer, int[]> TWF;

    // getters and setters
}

public class TestClass implements Serializable {
    private String name;

    // getters and setters
}

И код сохранения данных:

    /* Initialize Hash operation*/
    String KEY = "redis-map-key";
    hashOperations = redisTemplate.opsForHash();

    /* Fill Entity to save */
    TestEntity testEntity = new TestEntity();

    Map<Integer, int[]> mapWithArray = new HashMap<>();
    int[] arr = {1, 5, 8};
    mapWithArray.put(1, arr);

    /* Internal class */
    TestClass testClass = new TestClass();
    testClass.setName("Test name");
    Map<Integer, TestClass> internal = new HashMap<>();
    internal.put(99, testClass);

    /* Fill final object */
    testEntity.setId("entity-id");
    testEntity.setTWF(mapWithArray);
    testEntity.setInteral(internal);

    /* Save entity */
    hashOperations.put(KEY, testEntity.getId(), testEntity);

    /* Load entity */
    TestEntity entityLoaded = (TestEntity) hashOperations.get(KEY, testEntity.getId());

    System.out.println("Entity ID: " + entityLoaded.getId() + ", entity array: " + entityLoaded.getTWF());

RedisTemplate автоматически подключен.

Всеотлично работает и с другими типами из вашего класса (Date, int, boolean)

...