首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

启用DefaultTyping时,使用Jackson时Scala Enum序列化失败

是因为Scala的枚举类型在Jackson中的序列化和反序列化过程中存在一些问题。

在Scala中,枚举类型是通过sealed trait和case object来定义的,而在Java中,枚举类型是通过enum关键字来定义的。由于Scala和Java在枚举类型的定义方式上存在差异,导致在使用Jackson进行序列化和反序列化时会出现问题。

为了解决这个问题,可以通过自定义Jackson的序列化和反序列化器来处理Scala的枚举类型。具体步骤如下:

  1. 创建一个继承自JsonSerializer的自定义序列化器,实现对Scala枚举类型的序列化逻辑。例如:
代码语言:txt
复制
import com.fasterxml.jackson.core.JsonGenerator
import com.fasterxml.jackson.databind.{JsonSerializer, SerializerProvider}

class ScalaEnumSerializer extends JsonSerializer[Enumeration#Value] {
  override def serialize(value: Enumeration#Value, gen: JsonGenerator, serializers: SerializerProvider): Unit = {
    gen.writeString(value.toString)
  }
}
  1. 创建一个继承自JsonDeserializer的自定义反序列化器,实现对Scala枚举类型的反序列化逻辑。例如:
代码语言:txt
复制
import com.fasterxml.jackson.core.JsonParser
import com.fasterxml.jackson.databind.{JsonDeserializer, DeserializationContext}

class ScalaEnumDeserializer extends JsonDeserializer[Enumeration#Value] {
  override def deserialize(p: JsonParser, ctxt: DeserializationContext): Enumeration#Value = {
    val value = p.getValueAsString
    // 根据枚举类型的名称获取对应的枚举值
    // 例如:Color.withName(value)
  }
}
  1. 在Scala枚举类型的伴生对象中添加@JsonSerialize和@JsonDeserialize注解,指定使用自定义的序列化器和反序列化器。例如:
代码语言:txt
复制
import com.fasterxml.jackson.databind.annotation.{JsonSerialize, JsonDeserialize}

@JsonSerialize(using = classOf[ScalaEnumSerializer])
@JsonDeserialize(using = classOf[ScalaEnumDeserializer])
object Color extends Enumeration {
  type Color = Value
  val Red, Green, Blue = Value
}

通过以上步骤,就可以解决启用DefaultTyping时,使用Jackson时Scala Enum序列化失败的问题。

推荐的腾讯云相关产品:腾讯云对象存储(COS),它是一种高可用、高可靠、低成本、强大的云端存储服务,适用于存储和处理各种非结构化数据,包括图片、音视频、文档等。产品介绍链接地址:https://cloud.tencent.com/product/cos

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

jackson设置读取属性使用大写序列化属性使用小写

jackson是一种使用广泛的json序列化库,虽然性能上可能不如fastjson,但是从其标准性以及安全性上来看(近一年爆出了不少fastjson的漏洞),下面就介绍下本文的主题,jackson序列化以及反序列化时可能用到的几个注解...应用之间的数据传输,在.net中属性的命名规则是大写,但是在java中属性是遵从驼峰式命名规则的,所以为了能正确解析从.net返回的json数据,我们这里用到了@JsonSetter这个注解,这个注解是用在反序列化阶段的...,所以没使用@JsonGetter注解。...PS: 1、我们不仅可以定义属性的大小写,还可以定义属性的名字 2、json的序列化过程用到@JsonGetter注解(此阶段是读取对象属性然后转换成json),反序列化用到@JsonSetter注解(...该过程是读取json然后设置对象属性) 3、如果序列化以及反序列化使用相同的名字,而且与java类属性名不一致的话可以使用@JsonProperty注解

1.1K10

Spring Data Redis对象缓存序列化问题

相信在项目中,你一定是经常使用 Redis ,那么,你是怎么使用的呢?在使用时,有没有遇到同我一样,对象缓存序列化问题的呢?那么,你又是如何解决的呢?...在我们需要缓存的方法上,使用 @Cacheable 注解,就表示如果返回的对象不是 null ,就会对其进行缓存,下次查询,首先会去缓存中查询,查到了,就直接返回,不会再去数据库查询,查不到,再去数据库查询...使用启用缓存注解(@EnableCaching)。需要缓存的对象实现 Serializable 接口。使用 @Cacheable 注解缓存查询的结果。...使用 Jackson ,遇到特殊类型的字段会报错,比如 LocalDateTime。...解决办法其实我们知道,使用的就是 Jackson 进行 json 转换,而 json 转换,遇到 LocalDateTime 问题,我们配置一下 module 就可以了,因为默认用的 SimpleModule

27510

从零搭建Spring Boot脚手架(6):整合Redis作为缓存

整合目标 使项目具有缓存功能,同时将默认的JDK序列化修改为Jackson序列化以存储一些对象,同时实现一些特定的个性化的缓存空间以满足不同场景下的不同缓存TTL时间需求。 3....一个是RedisTemplate,主要用于对象缓存,其默认使用JDK序列化,我们需要更改其序列化方式解决一些问题,比如Java 8日期问题、JSON序列化问题。...Jackson2JsonRedisSerialize 替换默认序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer...= initJacksonSerializer(); // 设置value的序列化规则和 key的序列化规则 template.setValueSerializer(jackson2JsonRedisSerializer...); //bugFix Jackson2反序列化数据处理LocalDateTime类型出错 om.disable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS

94030

spring boot redis 缓存_redis本地缓存

本地缓存可以使用 Guava 或 Caffeine 提供的解决方案,而远程缓存则可以选择 Redis 这样的内存数据库。本文记录一下 SpringBoot 集成 Redis 做缓存的相关配置。...jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //解决查询缓存转换异常的问题,为Jackson...LinkedHashMap对象 om.activateDefaultTyping( LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL...RedisTemplate 可以实现手动缓存或其他对 Redis 操作,但之前只是配置缓存相关配置,直接使用RedisTemplate 不会生效,需要单独配置。...); redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // hash数据结构序列化方式,必须这样否则存hash 就是基于jdk

2.1K30

2 Springboot中使用redis,配置redis的key value生成策略

这是默认的key生成策略,是通过序列化Serializable后生成的key,当读取缓存系统再通过反序列化得到Post对象。...当然也可以自己定义序列化方式,使用别的Json工具类,或者别的什么方法来完成序列化方式。 完成RedisTemplate的设置后,再次save一个Post对象来看看在redis里的存储方式。 ?...通过上面的配置,我们就完成对序列化方式自定义的配置,尤其是key的定制,能方便日后的查看以及在别的地方操作key更易识别。...然后在创建RedisTemplate使用这个自定义的JedisConnectionFactory即可。...该篇到此为止,下面还有几个问题需要考虑: 1.怎么处理db操作成功了,但操作redis失败

3.8K20

springboot高级特性-redis作为缓存

因为我们存储对象到redis redis默认的是jdk序列化方式 与我们想要的json等格式有一些区别 所以我们 需要自己指定redis的序列化方式 我们 创建一个配置类 设置 redis的序列化器...Jackson2JsonRedisSerialize 替换默认序列化 Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer...\x00\x00\x01t\x00\x0e2858458@qq.comq\x00~\x00\x06q\x00~\x00\x06t\x00\x06\xe7\x8e\x8b\xe4\xba\x94" 发现使用序列化的方式保存的...默认保存数据 k-v都是Object 的时候;利用序列化来保存的 我们需要更改CacheManager 使用Json的方式缓存 在配置类中添加配置 @Configuration public class...Jackson2JsonRedisSerialize 替换默认序列化 Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer

37630

用了几年的 Fastjson,我最终替换成了Jackson

json串的统一策略,如果要在一个json串中使用不同的策略则可以使用@JsonProperty.value()指定字段名 启用fastjson的autotype功能,即根据json字符串中的@type...自动选择反序列化的类 Feature.SupportAutoType 关闭 ObjectMapper.DefaultTyping.* 开启 jackson的PolymorphicDeserialization..."abc",而在不启用NonStringKeyAsString,JSON.parseObject(text).getString("123")只能得到null,必须通过JSON.parseObject...@JSONCreator 指定反序列化时创建java对象使用的构造方法,对应jackson的@JsonCreator。 @JSONField 指定序列化和反序列化field的行为。...> deserializer() default Void.class; // 序列化时,如果filed是枚举类型,则和普通的java bean一样输出枚举的filed,而不是通常使用Enum.name

4.8K10

Redis 分布式锁遇到的序列化问题

场景描述 最近使用 Redis 遇到了一个类似分布式锁的场景,跟 Redis 实现分布式锁类比一下,就是释放锁失败,也就是缓存删不掉。...Jackson2JsonRedisSerialize 替换默认序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer...而 RedisTemplate 的 key 使用 StringRedisSerializer,value 使用的是 Jackson2JsonRedisSerializer 序列化(至于为什么用这个,这里就不是我写的了...小结 本文遇到的这个问题,主要是因为使用了不同的 RedisTemplate 来加锁和释放锁,而这两个 template 使用了不同的序列化方式,最终还是序列化带来的问题。...当初真是草率了,而且一还没测出来…… 对于生产环境,还是要慎之又慎:如临深渊,如履薄冰。

43420

就像一个从来没有杀过猪的人在教别人杀猪

就像一个从来没有杀过猪的人在教别人杀猪一、介绍在上一篇文章里,在公共模块中引入了redis依赖,从而造成没有配置redis信息的模块,在启动,会默认去连接localhost:6379。...这是我们不希望看到的,所以便有了上一篇文章当SpringBoot引用Redis依赖但没有配置Redis信息 | 半月无霜 (banmoon.top)好巧不巧,目前又出现了一个情况。...所以没办法,我只能再继续改造这个RedisConfig.java二、代码1)配置类原本的RedisConfig.java,用来给selevt使用package com.banmoon.business.config...// value序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); // hash...的value序列化方式采用jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet

7500

分布式改造剧集之Redis缓存踩坑记

这个情形和一年前我在另一个项目中试图优化mybatis简直完全一致,即使拿出了源码来debug还是解决不了这个问题,网上搜索的方法全部尝试了一遍还是不行。...就在我信心满满,准备测试验证主流程缓存使用情况的时候,意料之中地报错了,也就是这个错,拉开了我的采坑填坑之路...... ---- 坑1 ​ 不多废话了,直接给出报错的信息: Caused by: com.fasterxml.jackson.databind.JsonMappingException...通过网上搜索资料后得知,jackson底层的序列化和反序列化使用的是ObjectMapper,而ObjectMapper在初始化之后可以设置各种各样的属性,通过查看源码发现有一个MapperFeature.USE_ANNOTATIONS...因为我定义的MyObjectMapper没有配置DefaultTyping属性,jackson使用简单的数据绑定具体的java类型,其中Object就会在反序列化的时候变成LinkedHashMap....当然还是有收获的,具体来说有以下几点: Jackson与ObjectMapper: 基本上Jackson导致的序列化和反序列化问题在无法改动源代码,都是可以通过调整ObjectMapper的相关属性来解决的

1.2K40
领券