Пользовательский класс @Id для Spring Data Redis - PullRequest
0 голосов
/ 21 октября 2018

Я пытаюсь преобразовать / сериализовать поле @Id (которое не является строкой) класса модели, но продолжаю получать эту ошибку.Пользовательский класс ID просто объединяет два значения с двоеточием, например aaaa:2345.

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [MyIdClass] to type [byte[]]

Это мой класс модели.

@RedisHash("alert")
public class MyClass implements Serializable
{
    public static class MyIdClass
    {
        public String userId;
        public Long sessionExpiry;

        public MyIdClass()
        {
        }

        public MyIdClass(String id, Long ex)
        {
            userId = id;
            sessionExpiry = ex;
        }
    }

    public static class MyIdClassSerializer implements RedisSerializer<MyIdClass>
    {
        @Nullable
        @Override
        public byte[] serialize(@Nullable MyIdClass uid) throws SerializationException
        {
            return String.format("%s:%d", uid.userId, uid.sessionExpiry).getBytes();
        }

        @Nullable
        @Override
        public MyIdClass deserialize(@Nullable byte[] bytes) throws SerializationException
        {
            String[] t = new String(bytes).split(":");
            return new MyIdClass(t[0], Long.parseLong(t[1]));
        }
    }

    @Component
    @ReadingConverter
    public static class MyIdClassReader implements Converter<byte[], MyIdClass>
    {

        @Nullable
        @Override
        public MyIdClass convert(byte[] source)
        {
            String[] t = new String(source).split(":");
            return new MyIdClass(t[0], Long.parseLong(t[1]));
        }
    }

    @Component
    @WritingConverter
    public static class MyIdClassWriter implements Converter<MyIdClass, byte[]>
    {

        @Nullable
        @Override
        public byte[] convert(MyIdClass uid)
        {
            return String.format("%s:%d", uid.userId, uid.sessionExpiry).getBytes();
        }
    }

    /**
     * User ID
     * Key := 'alert:' userId ':' sessionExpiry
     */
    @Id
    public MyIdClass id;

    public String value;
}

Вот как я настраиваю RedisTemplate.

@Bean("redisTemplateActivityAlert")
public RedisTemplate<ActivityAlert.UserIdExpiry, ActivityAlert> redisTemplateActivityAlert()
{
    RedisTemplate<ActivityAlert.UserIdExpiry, ActivityAlert> template = new RedisTemplate<>();
    template.setConnectionFactory(jedisConnectionFactory());
    template.setKeySerializer(new ActivityAlert.UserIdExpirySerializer());
    template.setHashKeySerializer(new ActivityAlert.UserIdExpirySerializer());
    return template;
}

Я читал другие посты о настройке ConversionService или TypeConverter, но не зашел с ними далеко.

1 Ответ

0 голосов
/ 26 октября 2018

добавьте этот Бин в свою конфигурацию Redis:

    @Bean
    public RedisCustomConversions redisCustomConversions(MyIdClassReader  myIdClassReader , MyIdClassWriter  myIdClassWriter ) {
        return new RedisCustomConversions(Arrays.asList(myIdClassWriter,myIdClassReader)); 
    }
...