在Spring 4中使用通用的RedisTemplate [英] DRYing up a generic RedisTemplate in Spring 4

查看:761
本文介绍了在Spring 4中使用通用的RedisTemplate的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我读过Spring 4中的 @Autowired 泛型,这非常棒。



我有一个抽象的 RedisService 类,我想要 @Autowired 一个通用的RestTemplate,如下所示:

  public abstract class RedisService< T>实现InitializingBean {

private final String VALUE_KEY_PREFIX;
private final String SET_KEY;

@Autowired
私有RedisTemplate< String,T> valueTemplate;

@Autowired
private StringRedisTemplate stringTemplate;

私人SetOperations< String,String> setOperations;
私人ValueOperations< String,T> valueOperations;
//等等...
}

My Java config for valueTemplate s为 @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());

返回模板;
}

@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());

返回模板;
}
// ...为N个MyType类。

扩展 RedisService< T> 类看起来像这样:

  @Service 
public class MyTypeAService extends RedisService< MyTypeA> {

是否有更多DRY方式可以创建这些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());

返回redisTemplate;

缓存类的用法:

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


I've read that you can have @Autowired generics as of Spring 4, which is awesome.

I have an abstract RedisService class in which I want to have @Autowired a generic RestTemplate, like so:

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

My Java config for the valueTemplates to be @Autowired then looks something like:

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

Each class which extends the RedisService<T> class looks something like:

@Service
public class MyTypeAService extends RedisService<MyTypeA> { 

Is there a more DRY way I could be creating these RedisTemplate @Beans with my Java config?

解决方案

I had the same issue. You could create a generic bean for this, and use the GenricJackson2JsonRedisSerializer. The issue is that by using this the json will be saved with some extra data for the deserialization to work later on.

Another way would be to use the Jackson2JsonRedisSerializer but it needs the Class instance of the generic type to work, witch i couldnt figure out how to get.

@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;
}

Usage on cache class:

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

这篇关于在Spring 4中使用通用的RedisTemplate的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆