在Spring 4中干掉一个通用的RedisTemplate

Ton*_*ita 6 java generics spring dry redis

我已经读过你可以@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...
}
Run Code Online (Sandbox Code Playgroud)

我的Java配置为valueTemplate使他能@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.
Run Code Online (Sandbox Code Playgroud)

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

@Service
public class MyTypeAService extends RedisService<MyTypeA> { 
Run Code Online (Sandbox Code Playgroud)

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

Ces*_*cci -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;
}
Run Code Online (Sandbox Code Playgroud)

缓存类的用法:

@Autowired
@Qualifier("objectRedisTemplate")
private RedisTemplate<String, MyTypeA> redisTemplate;
Run Code Online (Sandbox Code Playgroud)