java.lang.Integer y java.lang.String están en el módulo java.base del cargador 'bootstrap'

Escenario del proyecto:

Escenario del proyecto: cuando trabaje en el proyecto de comida para llevar de Sky, utilice Redis para almacenar en caché datos de tipo cadena para representar el estado comercial de la tienda.

/**
 * 设置店铺营业状态
 *
 * @param status
 * @return
 */
@PutMapping("/{status}")
@ApiOperation("设置店铺营业状态")
public Result setStatus(@PathVariable Integer status) {
    log.info("设置店铺营业状态:{}", status == 1? "营业中" : "打样中");
    redisTemplate.opsForValue().set(KEY, status);
    return Result.success();
}

Descripción del problema

Al modificar el estado de la tienda, el mensaje de error es que los datos de tipo Integer no se pueden convertir al tipo String y almacenar en redis.

2023-08-20 06:14:12.477 ERROR 28204 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')] with root cause

java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
	at org.springframework.data.redis.serializer.StringRedisSerializer.serialize(StringRedisSerializer.java:36) ~[spring-data-redis-2.7.2.jar:2.7.2]

Análisis de causa:

1. Al valor en el valor-clave se le puede asignar cualquier tipo de datos, y los datos se convertirán en un tipo de cadena y se almacenarán en redis. En teoría, puede almacenar datos de tipo entero.

2. Verifiqué la clase de configuración RedisTemplate y descubrí que // configuró el serializador de redis como un tipo de cadena, lo que no se ajusta al código estándar.

3. Tanto setDefaultSerializer como setKeySerializer son métodos de la clase RedisTemplate, que se utilizan para configurar el método de serialización. Entre ellos, el método setDefaultSerializer () se usa para configurar el método de serialización predeterminado y el método setKeySerializer () se usa para configurar el método de serialización de la clave almacenada en Redis. Específicamente, si el método de serialización predeterminado se establece usando el método setDefaultSerializer(), cuando se usa el objeto RedisTemplate para operaciones, si no se especifica el método de serialización de la clave, se usará el método de serialización predeterminado para el almacenamiento. Y si el método de serialización de la clave se configura usando el método setKeySerializer(), cuando el objeto RedisTemplate se usa para operaciones, si no se especifica el método de serialización del valor, se usará el método de serialización de la clave para el almacenamiento. 

@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
    log.info("开始配置redis模版对象:{}",redisConnectionFactory);
    RedisTemplate redisTemplate = new RedisTemplate();
    //设置redis的连接公场对象.
    redisTemplate.setConnectionFactory(redisConnectionFactory);
    //设置redis的序列化器为字符串类型.
    redisTemplate.setDefaultSerializer(new StringRedisSerializer());
    return redisTemplate;
}

solución:

//Establece el serializador de redis al tipo de cadena.Modificar a

redisTemplate.setKeySerializer(new StringRedisSerializer());

Guess you like

Origin blog.csdn.net/SIHUAZERO/article/details/132388312