Spring Framework Spring-Data-Redis исключение сериализации - PullRequest
0 голосов
/ 17 января 2020

Я очень новичок в Java программировании. Я C# разработчик. Я работал над одним из небольших проектов, где мы хотим использовать кэш redis вместо ehcache.

Мы используем spring.data.redis версии 2.2.3.RELEASE и redis.client.jedis версии 3.2.0.

Вот мой класс redisconf, который также содержит RedisTemplate:

public class RedisConf {
    private String REDIS_HOSTNAME = "localhost";
    private int REDIS_PORT = 6379;

    protected JedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(REDIS_HOSTNAME, REDIS_PORT);
        JedisClientConfiguration jedisClientConfiguration = JedisClientConfiguration.builder().usePooling().build();
        JedisConnectionFactory factory = new JedisConnectionFactory(configuration,jedisClientConfiguration);
        factory.afterPropertiesSet();
        return factory;
    }


    public RedisTemplate<String,Element> redisTemplate() {
        final RedisTemplate<String,Element> redisTemplate = new RedisTemplate<String,Element>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new GenericToStringSerializer<Object>(Object.class));
        redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

Вот как создается экземпляр класса RedisConf:

RedisConf rf = new RedisConf();
RedisTemplate<String, Element> redisTemplate = rf.redisTemplate();
redisTemplate.getConnectionFactory().getConnection().ping();
cache = new RedisDelegate(redisTemplate);

Вот мой класс RedisDeligate, где я выполняю все операции get и put:

public class RedisDelegate implements Cache {

    private final RedisTemplate<String,Element> redisTemplate;
    private final Logger LOGGER = LoggerFactory.getLogger(RedisDelegate.class);
    private static String REDIS_KEY = "Redis";

    public RedisDelegate(RedisTemplate<String,Element> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Override
    public String getName() {
        return "my-redis";
    }

    @Override
    public Object getNativeCache() {
        return this.redisTemplate;
    }

    @Override
    public Element get(Object key) {

        try {
            LOGGER.debug("Key is: {}", key);
            Object element = this.redisTemplate.opsForHash().get(REDIS_KEY, key);
            LOGGER.debug("element Object is: {}", element);
            return (element == null) ? null : (Element) element;
            //return (Element) this.redisTemplate.opsForHash().get(REDIS_KEY, key);
        } catch (Exception e) {
            LOGGER.error(e.getMessage());
        }
        return null;
    }

    @Override
    public void put(Element element) {
        this.redisTemplate.opsForHash().put(REDIS_KEY, element.key(), element);
    }

    @Override
    public void evict(Object key) {
        this.redisTemplate.opsForHash().delete(REDIS_KEY, key);  
    }

    @Override
    public void clear() {
        redisTemplate.execute((RedisCallback<Object>) connection -> {
            connection.flushDb();
            return null;
        });
    }
}

Вот CacheElement Объект, который я пытаюсь поместить в кеш, который реализует Serializable, как показано ниже:

public class CacheElement implements Element, Serializable {
.
.
.
}

Когда я пытаюсь поместить объект в кеш, происходит сбой с ошибкой, что сериализация не удалась. Я знаю, что есть некоторая проблема с моим RedisTemplate, но я не вижу, чтобы выяснить это. Вот ошибка, которую я получаю:

Невозможно сериализовать; вложенным исключением является org.springframework.core.serializer.support.SerializationFailedException: не удалось сериализовать объект с помощью DefaultSerializer; вложенное исключение: java .lang.IllegalArgumentException: DefaultSerializer требуется сериализуемая полезная нагрузка, но получен объект типа [io.gravitee.policy.cache.resource.CacheElement]

EDIT

Я пытаюсь сохранить экземпляр класса CacheElement в Redis:

public class CacheElement implements Element {

    private final String key;

    private final CacheResponse response;

    private int timeToLive = 0;

    public CacheElement(String key, CacheResponse response) {
        this.key = key;
        this.response = response;
    }

    public int getTimeToLive() {
        return timeToLive;
    }

    public void setTimeToLive(int timeToLive) {
        this.timeToLive = timeToLive;
    }

    @Override
    public Object key() {
        return key;
    }

    @Override
    public Object value() {
        return response;
    }

    @Override
    public int timeToLive() {
        return timeToLive;
    }
}

Объект CacheResponse содержит буфер.

public class CacheResponse {

    private int status;

    private HttpHeaders headers;

    private Buffer content;

    public Buffer getContent() {
        return content;
    }

    public void setContent(Buffer content) {
        this.content = content;
    }

    public HttpHeaders getHeaders() {
        return headers;
    }

    public void setHeaders(HttpHeaders headers) {
        this.headers = headers;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }
}

Я хотел бы сериализовать этот CacheElement возьмите объект и сохраните его в Redis. Я также хотел бы десериализовать его при операции get.

Буду признателен за помощь в устранении этой проблемы. Как я уже говорил, я не Java разработчик. Я родом из C# и мира визуальных студий. Спасибо

1 Ответ

0 голосов
/ 17 января 2020

Пожалуйста, реализуйте свой класс объекта paypload с Serializable интерфейсом

...