【问题标题】:Spring Boot - Custom JsonDeserializer is ignoredSpring Boot - 自定义 JsonDeserializer 被忽略
【发布时间】:2021-05-13 03:18:18
【问题描述】:

我正在尝试将自定义 Jackson 反序列化器(类“com.fasterxml.jackson.databind.JsonDeserializer”)应用于需要自定义反序列化的第三方库中的 bean。我的自定义反序列化器是用 Kotlin 编写的:

@JsonComponent
class CustomDeserializer: JsonDeserializer<ThirdPartyBean> {

    constructor(): super() {
        println("CustomDeserializer registered")
    }

    override fun deserialize(parser: JsonParser?, context: DeserializationContext?): ThirdPartyBean? {
        // Custom deserialization
    }

    override fun handledType(): Class<*> {
        return ThirdPartyBean::class.java
    }
}

我已尝试执行以下所有操作(实际上是它们的所有组合):

  1. 按原样使用类:我可以看到反序列化程序已被拾取 - 我可以看到正在打印“已注册的自定义序列化程序”。
  2. 使用自定义反序列化器注释使用 ThirdPartyBean 的字段(见下文)
  3. 使用 ApplicationContext 显式注册解串器(见下文)

广告 2:

@JsonDeserialize(using = CustomDeserializer::class)
fun getThirdPartyBean(): ThirdPartyBean = thirdPartyBean

广告 3:

@Bean
fun jacksonBuilder(): Jackson2ObjectMapperBuilder {
    return Jackson2ObjectMapperBuilder()
        .deserializers(CustomDeserializer())
}

无论我尝试了什么,在尝试序列化包含“ThirdPartyBean”类型属性的 bean 时,我总是会收到此客户端错误:

    org.springframework.core.codec.CodecException: Type definition error: [simple type, class com.example.ThirdPartyBean]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.example.ThirdPartyBean` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

Spring Boot 版本为 2.3.1。我对如何解决这个问题束手无策,不胜感激。

【问题讨论】:

    标签: spring-boot jackson deserialization spring-webflux json-deserialization


    【解决方案1】:

    我已经设法自己解决了这个问题。但是我很确定必须/应该有一个更简单的解决方案,所以我很高兴听到任何建议。我通过在 WebClient 设置中手动注册包含我的 CustomDeserializer 的 Jackson 模块解决了这个问题:

    @SpringBootApplication
    @EnableWebFlux
    class MyApplication: WebFluxConfigurer {
    
        @Autowired
        private lateinit var objectMapper: ObjectMapper
    
        @Bean
        fun webClient(): WebClient {
            val customDeserializerModule = SimpleModule()
    
            customDeserializerModule.addDeserializer(ThirdPartyBean::class.java, CustomDeserializer())
            objectMapper.registerModule(customDeserializerModule)
    
            return WebClient
                .builder()
                .codecs { it.defaultCodecs().jackson2JsonDecoder(Jackson2JsonDecoder(objectMapper)) }
                .build()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-12
      • 2018-12-06
      • 2019-04-21
      • 2010-09-10
      • 2021-11-04
      • 1970-01-01
      • 2018-02-25
      • 1970-01-01
      • 2014-10-09
      相关资源
      最近更新 更多