You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring中使用ReactiveCrudRepository存储java.lang.Class至MongoDB遇错求助

解决MongoDB存储java.lang.Class类型的Codec错误及全局转换器冲突

问题描述

使用ReactiveCrudRepository存储包含Class<?>类型字段的Letter实体时,抛出错误:

Can't find a codec for class java.lang.Class.

自定义全局转换器后,出现新问题:实体中其他String类型属性被错误转换为Class<?>类型。

解决方案

为自定义转换器添加@ReadingConverter和@WritingConverter注解,限定转换器仅作用于Class<?>与String的类型转换,避免全局干扰。

修正后的转换器配置代码:

import org.springframework.core.convert.converter.Converter
import org.springframework.data.convert.ReadingConverter
import org.springframework.data.convert.WritingConverter
import org.springframework.data.mongodb.core.convert.MongoCustomConversions
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration

@Configuration
class MongoConverterConfig {

    @Bean
    fun customConversions(): MongoCustomConversions {
        val converters = mutableListOf<Converter<*, *>>()
        converters.add(ClassToStringConverter())
        converters.add(StringToClassConverter())
        return MongoCustomConversions(converters)
    }

    @WritingConverter
    class ClassToStringConverter : Converter<Class<*>, String> {
        override fun convert(source: Class<*>): String {
            return source.name
        }
    }

    @ReadingConverter
    class StringToClassConverter : Converter<String, Class<*>> {
        override fun convert(source: String): Class<*> {
            return Class.forName(source)
        }
    }
}

原理说明

  • @WritingConverter:标记该转换器仅在Java对象写入MongoDB时触发,且仅处理Class<?>类型的字段,将其转为全类名字符串存储。
  • @ReadingConverter:标记该转换器仅在MongoDB数据映射到Java对象时触发,仅将目标类型为Class<?>的字段从字符串转回Class<?>类型。
  • 这种配置既解决了MongoDB无Class<?>默认Codec的问题,又不会影响实体中其他String类型属性的正常读写。

内容的提问来源于stack exchange,提问作者xX_Xeno_Blade_Xx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:46:01