Redis: класс java .lang.String не может быть приведен к классу java .util.List в методе @Cacheable - PullRequest
0 голосов
/ 03 февраля 2020

Мне нужно добавить кэш Redis в метод, который возвращает список значений.

Я использую этот учебник в качестве основы https://www.baeldung.com/spring-data-redis-tutorial

исключение показывает это

java.lang.ClassCastException: class java.lang.String cannot be cast to class java.util.List (java.lang.String and java.util.List are in module java.base of loader 'bootstrap')
    at 

@Cacheable(cacheNames = "customerDetailByParam", key="{#searchParams.toString()}")
    @Retryable(value = { HttpServerErrorException.class }, maxAttempts =  RETRY_ATTEMPTS, backoff = @Backoff(delay = 5000))
    public List<ObjectResponse> searchCustomerDetailByParam(MultiValueMap<String, String> searchParams) 

Я искал некоторые решения, однако ни одно из них не работает.

CacheConfig. java

@Configuration
@EnableCaching
@ConditionalOnMissingBean(value = CacheManager.class)
@Slf4j
public class CacheConfig {

    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("localhost", 6379);
        //redisStandaloneConfiguration.setPassword(RedisPassword.of("yourRedisPasswordIfAny"));
        return new JedisConnectionFactory(redisStandaloneConfiguration);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(jedisConnectionFactory());
        template.setValueSerializer(new GenericToStringSerializer<Object>(Object.class));
        template.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        RedisSerializer<Object> serializer = new JdkSerializationRedisSerializer(getClass().getClassLoader());

        template.setDefaultSerializer(serializer);

        return template;
    }


}

ObjectResponse. java

@Data
@NoArgsConstructor
@AllArgsConstructor
public class ObjectResponse implements Serializable {

    @JsonProperty("id")
    private String customerId;

    @JsonProperty("name")
    @JsonAlias("full_name")
    private String customerName;

    private String document;

    private String email;

}

1 Ответ

0 голосов
/ 04 февраля 2020

Мне удалось исправить проблему, изменив шаблон на следующую конфигурацию.

  @Bean
  public RedisTemplate<String, Object> redisTemplate() {
        final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.setConnectionFactory(jedisConnectionFactory());
        return template;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...