【问题标题】:DRYing up a generic RedisTemplate in Spring 4在 Spring 4 中干掉一个通用的 RedisTemplate
【发布时间】:2014-06-06 03:27:39
【问题描述】:

我听说你可以在 Spring 4 中使用 @Autowired 泛型,这太棒了。

我有一个抽象的 RedisService 类,我希望在其中有一个通用的 RestTemplate @Autowired,如下所示:

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...
}

我的 valueTemplates 的 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&lt;T&gt; 类的类看起来像:

@Service
public class MyTypeAService extends RedisService<MyTypeA> { 

我可以用我的 Java 配置创建这些 RedisTemplate @Beans 吗?

【问题讨论】:

  • 嗨@Tony 请问你能解决这个问题吗?如果有,请问如何?

标签: java spring generics redis dry


【解决方案1】:

我有同样的问题。您可以为此创建一个通用 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;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
相关资源
最近更新 更多