java - 在 Spring 4 中干燥一个通用的 RedisTemplate

标签 java spring generics redis dry

我读到你可以拥有 @Autowired Spring 4 的泛型,这很棒。

我有一个摘要RedisService我想上的课@Autowired一个通用的 RestTemplate,像这样:

public abstract class RedisService<T> implements InitializingBean {

private final String VALUE_KEY_PREFIX;
private final String SET_KEY;

@Autowired
private RedisTemplate<String, T> valueTemplate;

@Autowired
private StringRedisTemplate stringTemplate;

private SetOperations<String, String> setOperations;
private ValueOperations<String, T> valueOperations; 
// and so on...
}

我的 valueTemplate 的 Java 配置是@Autowired然后看起来像:

@Bean
public RedisTemplate<String, MyTypeA> myTypeARedisTemplate() {
    RedisTemplate<String, MyTypeA> template = new RedisTemplate<>();

    template.setKeySerializer(stringRedisSerializer());
    template.setHashKeySerializer(stringRedisSerializer());
    template.setValueSerializer(new Jackson2JsonRedisSerializer<>(MyTypeA.class));
    template.setConnectionFactory(jedisConnectionFactory());

    return template;
}

@Bean
public RedisTemplate<String, MyTypeB> myTypeBRedisTemplate() {
    RedisTemplate<String, MyTypeB> template = new RedisTemplate<>();

    template.setKeySerializer(stringRedisSerializer());
    template.setHashKeySerializer(stringRedisSerializer());
    template.setValueSerializer(new Jackson2JsonRedisSerializer<>(MyTypeB.class));
    template.setConnectionFactory(jedisConnectionFactory());

    return template;
}
// ... for N MyType classes.

扩展 RedisService<T> 的每个类类看起来像:

@Service
public class MyTypeAService extends RedisService<MyTypeA> { 

有没有更干的方法可以创建这些 RedisTemplate @Bean与我的 Java 配置有关吗?

最佳答案

我遇到了同样的问题。您可以为此创建一个通用 bean,并使用 GenricJackson2JsonRedisSerializer。问题是,通过使用它,json 将与一些额外的数据一起保存,以便稍后进行反序列化。

另一种方法是使用 Jackson2JsonRedisSerializer,但它需要通用类型的 Class 实例才能工作,我不知道如何获取。

@Bean("objectRedisTemplate")
public <T> RedisTemplate<String, T> objectRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
    RedisTemplate<String, T> redisTemplate = new RedisTemplate<>();

    redisTemplate.setConnectionFactory(redisConnectionFactory);

    RedisSerializer<String> serializer = new StringRedisSerializer();
    redisTemplate.setKeySerializer(serializer);
    redisTemplate.setHashKeySerializer(serializer);

    redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());

    return redisTemplate;
}

在缓存类上的用法:

@Autowired
@Qualifier("objectRedisTemplate")
private RedisTemplate<String, MyTypeA> redisTemplate;

关于java - 在 Spring 4 中干燥一个通用的 RedisTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23208010/

相关文章:

java - Red5-屏幕共享应用程序转换为小程序时屏幕共享屏幕边框模糊

Java ProcessBuilder 和 bash

java - 智能 Java 格式化程序

java - Spring Post方法与关系数据库(Rest Api)

delphi - TControlClass 作为通用 TControl 参数?

java - Genson 中类元数据的顺序很重要 - 有解决方法吗?

Spring Cloud Gateway 同时监听 HTTP 和 HTTPS?

java - 在Spring Boot App中使用Redis Stream通过HTTP长轮询来阻止HTTP响应

c# 锁定泛型函数

java - 泛型 List<String> 和 List<Integer> 未按预期运行