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
相关产品推荐
相关产品推荐

