首页 > 数据库 >配置redisTemplate序列化,解决乱码与反序列化失败

配置redisTemplate序列化,解决乱码与反序列化失败

时间:2024-01-15 21:14:16浏览次数:34  
标签:set redis 乱码 报错 redisTemplate new 序列化 objectMapper

/**
 * @projectName: MultiModuleDemo
 * @package: com.example.config
 * @className: RedisConfig
 * @description: TODO(配置RedisTemplate序列化)
 * @date: 2023/12/18 21:08
 * @version: 1.0
 */
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<Object, Object> redis = new RedisTemplate<>();
        redis.setConnectionFactory(factory);
        redis.setKeySerializer(new StringRedisSerializer());
//        redis.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
        //解决转换异常问题  java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to LoginUser
        redis.setValueSerializer(valueSerializer());
        redis.afterPropertiesSet();
        return redis;
    }

    /**
     * @return RedisSerializer<Object>
     * @author ccx
     * @description TODO 解决查询缓存转换异常的问题,设置这个在反序列化时就不会报错
     *  redis在存储进行序列化时,会将类中所有具有返回值的方法进行序列化
     *  但是在读取进行反序列化时是根据set方法实现的,所以在类中当有非set方法有返回值是反序列化就会出错
     *  这个问题是在反序列化LoginUser类时发现的,在JwtTokenFilter过滤器从redis读取用户时
     *  因为LoginUser类实现了UserDetail,重写了一些isXXX方法,这些方法具有boolean返回值,但没有set方法,所以在序列化时会把值写进去,但反序列化时因为没有set方法又不能正常反序列化所以报错了
     * @date 2024/1/3 23:23
     */
    private RedisSerializer<Object> valueSerializer(){
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        //setVisibility用于设置序列化和反序列化时的访问级别
            //JsonAutoDetect.Visibility.ANY:any表示任务可见属性都将被序列化和反序列化;还有PUBLIC_ONLY:只有public属性将被序列化和反序列化;等等
        objectMapper.setVisibility(PropertyAccessor.ALL,JsonAutoDetect.Visibility.ANY);
        //序列化时会带上类全名,这样在反序列化时就能成功了,现在enableDefaultTyping方法弃用了,应该换成activateDefaultTyping
//        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
        //反序列化时,遇到未知属性会不会报错,true - 遇到没有的属性就报错 false - 没有的属性不会管,不会报错
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        serializer.setObjectMapper(objectMapper);
        return serializer;
    }
}

标签:set,redis,乱码,报错,redisTemplate,new,序列化,objectMapper
From: https://www.cnblogs.com/ccx-lly/p/17966319

相关文章

  • C# 对象序列化 单元测试 .netframework
    对象序列化以及单元测试F:\song\netframework_serialize\netframework_serialize\Program.csusingnetframework_serialize.Animal;usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Runtime.Serialization.Formatters.Bina......
  • SpringBoot集成Jackson实现JSON序列化
    一、前言Jackson是一个在Java中常用的JSON序列化和反序列化库,它具有操作简单、性能优秀、支持多种数据格式等特点,被广泛应用于各种服务端开发中。SpringMVC框架的默认json解析器也是Jackson。当前常见的json解析器还有Gson、fastjson等,jackson的优势是解析大的json文件处理速度快,运......
  • Java Web中文乱码的问题
    本编文章列举了JavaWeb编程中所有可能导致中文乱码的问题以及解决方法1、html页面乱码首先第一点便是html页面乱码问题例如:此时我们需要在项目中找到该网页的html文件,在html文件头部中找到metacharset="";然后将meta中的charset改为charset="UTF-8"如下图示:2、request乱码在debug......
  • delphi JSON序列化(五)
    关于TJSONConverters的使用unitUnit1;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls,Vcl.Buttons,Rest.JSON.Types,Rest.JsonReflect;t......
  • delphi JSON序列化(四)
    涉及的重要类REST.Json,REST.JsonReflect,REST.Json.Interceptors,REST.Json.Types单元中。一、TJson类最简单的一个类,提供了JSON->OBJECT和OBJECT->JSON几个方法,方法有TJsonOptions参数,如:   classfunctionObjectToJsonObject(AObject:TObject;AOptions:TJsonOpti......
  • netty: Marshalling序列化示例
    一、请求对象和响应对象,分别要实现Serializable接口packagecn.edu.tju;importjava.io.Serializable;publicclassUserRequestimplementsSerializable{privateStringusername;privateStringpassword;publicStringgetUsername(){returnus......
  • Java之序列化的详细解析
     3.序列化3.1概述Java提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息。反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反......
  • Django quertset、set的序列化
    一、几种序列化importjson#序列化querysetdefxuliehuaQueryset(request):querylist=models.LsTable.objects.all()querylist_json=serializers.serialize("json",querylist)returnHttpResponse(querylist_json)#序列化setdefxuliehuaQueryset(......
  • 数据反序列化参数TypeReference
    使用jackson或者fastjson将json字符串反序列化成对象(以fastjson为例)TypeReference<AjaxResult<List<Person>>>typeReference=newTypeReference<AjaxResult<List<Person>>>(){};Stringjson="{\"code\":200,\"success\......
  • redis中序列化问题,value包含全路径类名解析
    1.问题redis中保存的key-value格式value直接存入的是实体对象,值中包含全路径类名,在使用Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer解析器时报错报错内容:com.fasterxml.jackson.databind.exc.InvalidTypeIdException:Couldnotresolvetypeid'entity.r......