spring框架spring-data-redis序列化异常

问题描述 投票:0回答:1

我是Java编程的新手。我是C#开发人员。我正在做一个小型项目,我们要使用Redis缓存而不是ehcache。

我们正在使用spring.3.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;
        });
    }
}

这里是我试图放入实现Serializable的缓存中的CacheElement对象,如下所示:

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

[当我尝试将对象放入缓存时,它失败,并显示序列化失败的错误。我知道我的RedisTemplate有问题,但是我看不出来。这是我收到的错误:

无法序列化;嵌套异常为org.springframework.core.serializer.support.SerializationFailedException:无法使用DefaultSerializer序列化对象;嵌套异常是java.lang.IllegalArgumentException:DefaultSerializer需要一个可序列化的有效负载,但接收到类型的对象[io.gravitee.policy.cache.resource.CacheElement]

编辑

我正在尝试将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#和Visual Studio世界。谢谢

java jedis spring-data-redis
1个回答
0
投票

请使用Serializable接口实现您的paypload对象类

© www.soinside.com 2019 - 2024. All rights reserved.