CodecConfigurationException: Can‘t find a codec for class java.lang.Class.

前言

在使用spring data mongodb的mongoTemplate 更新数据时遇到如下错误
org.bson.codecs.configuration.CodecConfigurationException: Can’t find a codec for class java.lang.Class.

详细的错误信息

org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class java.lang.Class.at org.bson.internal.CodecCache.lambda$getOrThrow$1(CodecCache.java:52)at java.base/java.util.Optional.orElseThrow(Optional.java:403)at org.bson.internal.CodecCache.getOrThrow(CodecCache.java:51)at org.bson.internal.OverridableUuidRepresentationCodecRegistry.get(OverridableUuidRepresentationCodecRegistry.java:72)at org.bson.internal.ChildCodecRegistry.get(ChildCodecRegistry.java:52)at org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:206)at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:165)at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:44)at org.bson.internal.LazyCodec.encode(LazyCodec.java:38)at org.bson.codecs.EncoderContext.encodeWithChildContext(EncoderContext.java:91)at org.bson.codecs.DocumentCodec.writeValue(DocumentCodec.java:207)at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:165)at org.bson.codecs.DocumentCodec.encode(DocumentCodec.java:44)at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)at com.mongodb.internal.connection.SplittablePayload$WriteRequestEncoder.encode(SplittablePayload.java:221)at com.mongodb.internal.connection.SplittablePayload$WriteRequestEncoder.encode(SplittablePayload.java:187)at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)at com.mongodb.internal.connection.BsonWriterHelper.writeDocument(BsonWriterHelper.java:77)at com.mongodb.internal.connection.BsonWriterHelper.writePayload(BsonWriterHelper.java:59)at com.mongodb.internal.connection.CommandMessage.encodeMessageBodyWithMetadata(CommandMessage.java:168)at com.mongodb.internal.connection.RequestMessage.encode(RequestMessage.java:138)at com.mongodb.internal.connection.CommandMessage.encode(CommandMessage.java:62)at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:326)at com.mongodb.internal.connection.UsageTrackingInternalConnection.sendAndReceive(UsageTrackingInternalConnection.java:116)at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.sendAndReceive(DefaultConnectionPool.java:647)at com.mongodb.internal.connection.CommandProtocolImpl.execute(CommandProtocolImpl.java:71)at com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:244)at com.mongodb.internal.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:227)at com.mongodb.internal.connection.DefaultServerConnection.command(DefaultServerConnection.java:127)at com.mongodb.internal.connection.DefaultServer$OperationCountTrackingConnection.command(DefaultServer.java:357)at com.mongodb.internal.operation.MixedBulkWriteOperation.executeCommand(MixedBulkWriteOperation.java:477)at com.mongodb.internal.operation.MixedBulkWriteOperation.executeBulkWriteBatch(MixedBulkWriteOperation.java:339)at com.mongodb.internal.operation.MixedBulkWriteOperation.lambda$execute$2(MixedBulkWriteOperation.java:260)at com.mongodb.internal.operation.OperationHelper.lambda$withSourceAndConnection$2(OperationHelper.java:564)at com.mongodb.internal.operation.OperationHelper.withSuppliedResource(OperationHelper.java:589)at com.mongodb.internal.operation.OperationHelper.lambda$withSourceAndConnection$3(OperationHelper.java:563)at com.mongodb.internal.operation.OperationHelper.withSuppliedResource(OperationHelper.java:589)at com.mongodb.internal.operation.OperationHelper.withSourceAndConnection(OperationHelper.java:562)at com.mongodb.internal.operation.MixedBulkWriteOperation.lambda$execute$3(MixedBulkWriteOperation.java:232)at com.mongodb.internal.async.function.RetryingSyncSupplier.get(RetryingSyncSupplier.java:65)at com.mongodb.internal.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:268)at com.mongodb.internal.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:84)at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:212)at com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:1010)at com.mongodb.client.internal.MongoCollectionImpl.executeUpdate(MongoCollectionImpl.java:994)at com.mongodb.client.internal.MongoCollectionImpl.updateOne(MongoCollectionImpl.java:579)at org.springframework.data.mongodb.core.MongoTemplate.lambda$doUpdate$20(MongoTemplate.java:1695)at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:560)at org.springframework.data.mongodb.core.MongoTemplate.doUpdate(MongoTemplate.java:1668)at org.springframework.data.mongodb.core.MongoTemplate.updateFirst(MongoTemplate.java:1599)at com.wn.cloud.recommend.gateway.repository.mongo.impl.MongoRepositoryImpl.updateFirst(MongoRepositoryImpl.java:243)at com.wn.cloud.recommend.gateway.repository.mongo.impl.MongoRepositoryImpl$$FastClassBySpringCGLIB$$e32636f.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:793)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:763)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:708)at com.wn.cloud.recommend.gateway.repository.mongo.impl.MongoRepositoryImpl$$EnhancerBySpringCGLIB$$ac6a30e3.updateFirst(<generated>)at com.wn.cloud.recommend.gateway.impl.MongoGatewayImpl.updateFirst(MongoGatewayImpl.java:270)at com.wn.cloud.recommend.service.test.ProcessTest.test(ProcessTest.java:57)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:568)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74)at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84)at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)at org.junit.runners.ParentRunner.run(ParentRunner.java:413)at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:232)at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:55)

问题现场


@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class)
public class ProcessTest {@Autowiredprivate MongoGateway mongoGateway;@Testpublic void test() {String collectionName = mongoGateway.getCollectionName(User.class);System.out.println(collectionName);User user = new User();user.setId(1L);user.setUser_id(1111L);user.setAge(10);User user1 = mongoGateway.save(user, "user");System.out.println("新增user: " + JSON.toJSONString(user1));Query query = new Query();Criteria criteria = new Criteria(TableInfoEnum.USER.getUniqueFieldName());criteria.is(user.getUser_id());query.addCriteria(criteria);user.setAge(18);Update update = new Update();setUpdate(update, user);mongoGateway.updateFirst(query, update, User.class, "user");User one = mongoGateway.findOne(query, User.class, "user");System.out.println("one: " + JSON.toJSONString(one));}public void setUpdate(Update update, Object object) {if (null == object) {return;}Class<?> clazz = object.getClass();BeanInfo beanInfo;try {beanInfo = Introspector.getBeanInfo(clazz);PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {String name = propertyDescriptor.getName();Method readMethod = propertyDescriptor.getReadMethod();readMethod.setAccessible(true);Object invoke = readMethod.invoke(object, null);if (null != invoke) {update.set(name, invoke);// 后来新增System.out.println("name: " + name + " invoke: " + invoke);}}} catch (IntrospectionException | InvocationTargetException | IllegalAccessException e) {log.error("setUpdate属性失败,错误日志: {[]}", e);}}
}

代码的功能也很简单
第一个插入数据 使用到了 save
第二个 更新数据 使用到了 updateFirst

在updateFirst 更新方法中 会调用 setUpdate 进行属性复制 会把 User对象的属性 以及属性值都设置给Update 然后 进行更新

分析

刚开始以为缺少了什么 CodeC的加解密类 后来又增加了 日志打印设置的属性以及属性值 System.out.println("name: " + name + " invoke: " + invoke); 后来发现属性中居然有个class的 属性名 后来一想也是正常的 因为java的类默认有个Object父类然后在这个父类中 有个class属性以及 获取class的方法

public class Object {private static native void registerNatives();static {registerNatives();}public final native Class<?> getClass();
}    

然后在 mongoTemplate 的配置并未设置class的属性的编解码器 所以就报错了

解决

方式一: 设置解析class属性的 Codec 编解码器

import org.bson.BsonReader;
import org.bson.BsonWriter;
import org.bson.codecs.Codec;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext;public class ClassCodec implements Codec<Class<?>> {@Overridepublic void encode(BsonWriter writer, Class<?> value, EncoderContext encoderContext) {// 在此处实现将 Class 对象编码为 BSON 的逻辑// 例如,您可以将类名编码为字符串并写入 BsonWriterwriter.writeString(value.getName());}@Overridepublic Class<?> decode(BsonReader reader, DecoderContext decoderContext) {// 在此处实现将 BSON 解码为 Class 对象的逻辑// 例如,您可以从 BsonReader 读取字符串并使用 Class.forName() 加载相应的类String className = reader.readString();try {return Class.forName(className);} catch (ClassNotFoundException e) {throw new IllegalArgumentException("Failed to decode Class object.", e);}}@Overridepublic Class<?> getEncoderClass() {return Class.class;}
}

然后注册这个class编解码器 到mongodb template 即可 这是是将class的属性转化为className的字符串存储 然后读取也是读取这个字符串 如果需要 可以自行扩展实现

方式二: 排除掉这个属性的设置即可

public void setUpdate(Update update, Object object) {if (null == object) {return;}Class<?> clazz = object.getClass();BeanInfo beanInfo;try {beanInfo = Introspector.getBeanInfo(clazz);PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {String name = propertyDescriptor.getName();if (!"class".equalsIgnoreCase(name)) {Method readMethod = propertyDescriptor.getReadMethod();readMethod.setAccessible(true);Object invoke = readMethod.invoke(object, null);if (null != invoke) {update.set(name, invoke);System.out.println("name: " + name + " invoke: " + invoke);}}}} catch (IntrospectionException | InvocationTargetException | IllegalAccessException e) {log.error("setUpdate属性失败,错误日志: {[]}", e);}
}

the end !!!
good day ! !!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/735199.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI PC:重塑未来办公与生活方式的革命性工具

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面。而在PC领域&#xff0c;一场由AI引领的变革也正在悄然发生。从硬件到软件&#xff0c;从云端到终端&#xff0c;AI正在重塑我们的办公和生活方式。 AI工具网 | 人工智能工具推…

【蓝桥杯-单片机】基础模块:矩阵按键

文章目录 【蓝桥杯-单片机】基础模块&#xff1a;矩阵按键 【蓝桥杯-单片机】基础模块&#xff1a;矩阵按键 /** * 函数名 矩阵键盘扫描函数 * 函数功能 返回按下的按键键码值 * 入口参数 无 * 返回值 按键键码值 */ unsigned char Key_Read_Pro() {unsigned char temp 0;P3…

简单银行管理系统(C# winform SQL Server)

一、任务描述 1.使用Asp.NET技术&#xff0c;完成银行管理系统 2.开发工具&#xff1a;VS2010 3.数据库&#xff1a;SQL Server 2008 功能模块&#xff1a;登录、开户、存款、取款、转账、挂失等功能 运行界面&#xff1a; 1.登录界面&#xff08;Login.aspx&#xff09; 在…

YoloV7改进策略:卷积改进|MogaNet——高效的多阶门控聚合网络

文章目录 摘要论文:《MogaNet——高效的多阶门控聚合网络》1、简介2、相关工作2.1、视觉Transformers2.2、ViT时代的卷积网络3、从多阶博弈论交互的角度看表示瓶颈4、方法论4.1、MogaNet概述4.2、多阶门控聚合4.3、通过通道聚合进行多阶特征重新分配4.4、实现细节5、实验5.1、…

Django中的MySQL has gone away

在Django中遇到"Mysql has gone away"的错误,通常是因为MySQL数据库连接断开导致的。这可能是由于多种原因造成的,例如网络问题、数据库服务器的配置问题、数据库连接超时等。 为了解决这个问题,你可以尝试以下几个步骤: 检查数据库连接设置: 确保Django的配置文…

数据分析-Pandas两种分组箱线图比较

数据分析-Pandas两种分组箱线图比较 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&am…

牛客周赛 Round 36

赛况 C题可惜&#xff0c;比赛时模拟没有想明白&#xff0c;只对了一半&#xff0c;赛后看了大佬们的题解后恍然大悟&#xff0c;而F题是压根没思路&#xff0c;况且F题部分分也比较难拿。 题目列表 A-小红的数位删除 思路 将读入的数字整除10做三次后输出即可 参考代码 #inc…

高效管理百万级数据:MySQL备份与恢复实战指南

简介 在当今数字化时代&#xff0c;数据是企业不可或缺的核心资产之一&#xff0c;而MySQL作为一种流行的关系型数据库管理系统&#xff0c;其百万级数据的高效管理显得尤为重要。本实战指南将深入探讨MySQL备份与恢复的关键策略&#xff0c;为您提供全面而实用的解决方案。通…

streamlit学习-如何修改css样式

streamlit学习-如何修改css样式 效果图代码(srv.py)运行 streamlit默认的样式有时并不符合自己的要求。比如手机上的布局太浪费空间,我们希望一屏能放下所有的元素,本文演示了如何操作 效果图 代码(srv.py) import streamlit as st #1.31.1 import cv2 import numpy as np im…

埋点方案设计之感想

埋点方案设计是指在软件开发或者数据分析中&#xff0c;为了跟踪用户行为、收集数据以及进行分析&#xff0c;需要在代码中插入一些埋点&#xff08;Tracking&#xff09;代码&#xff0c;记录用户在应用中的各种操作和行为。下面是一个简单的埋点方案设计流程&#xff1a; 明…

报错:C51/Inc/Atmel/regx52.h(15):error41:syntax error near ‘sfr‘, expected ‘hdata‘

背景 跟着51单片机教程敲代码&#xff0c;在学习模块化编程这块&#xff0c;一会.h&#xff0c;一会.c文件的&#xff0c;文件切来切去&#xff0c;然后编译的时候就出了如题所示的错。 解决过程 看了报错信息&#xff0c;一直以为是regx52.h里的15行附近我手抖改了什么东西…

实验二(二)OSPF路由协议基础实验

1.实验介绍 1.1关于本实验 开放式最短路径优先 OSPF(Open Shortest Path First)是IETF 组织开发的一个基于链路状态的内部网关协议(Interior Gateway Protocol)。目前针对 IPv4 协议使用的是 OSPF Version 2(RFC2328);OSPF 作为基于链路状态的协议&#xff0c;OSPF 具有以下优…

OpenFeign的常规使用

架构: 一.新建module 引入依赖: <!--openfeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> yml配置; server:port: 80spring:applicati…

vue3学习与使用

1.setup setup() 函数是 vue3 中&#xff0c;专门为组件提供的新属性。它为我们使用 vue3 的 Composition API 新特性提供了统一的入口&#xff0c;setup 函数会在 beforeCreate 之后&#xff0c;created 之前执行, vue3 也是取消了这两个钩子&#xff0c;统一用 setup 代替, …

【 React 】对React Router的理解?常用的Router 组件有哪些

1 react-router 是什么 react-router等前端路由的原理大致相同&#xff0c;可以实现无刷新的条件下切换显示不同的页面 路由的本质就是页面的URL发生改变时&#xff0c;页面的显示结果可以根据URL的变化而变化&#xff0c;但是页面不会刷新 因此&#xff0c;可以通过前端路由可…

计算机网络(五)

网络层 网络层的主要目的是实现网络互连&#xff0c;进而实现数据包在各网络之间的传输。 要实现网络层&#xff0c;主要解决三个问题&#xff1a; ①网络层向运输层提供怎样的服务&#xff1f;&#xff08;“可靠传输“、”不可靠传输“&#xff09; ②网络层寻址 ③路由选择…

2024年k8s最新版本安装教程

k8s安装教程 1 k8s介绍2 环境搭建2.1 主机准备2.2 主机初始化2.2.1 安装wget2.2.2 更换yum源2.2.3 常用软件安装2.2.4 关闭防火墙2.2.5 关闭selinux2.2.6 关闭 swap2.2.7 同步时间2.2.8 修改Linux内核参数2.2.9 配置ipvs功能 2.3 容器安装2.3.1 设置软件yum源2.3.2 安装docker软…

动态规划(蓝桥杯 C++ 题目 代码 注解)

目录 介绍&#xff1a; 题目一&#xff08;数字三角形&#xff09;&#xff1a; 题目二&#xff08;跳跃&#xff09;&#xff1a; 题目三&#xff08;背包问题类型&#xff09;&#xff1a; 题目四&#xff08;蓝肽子序列&#xff09;&#xff1a; 题目五&#xff08;合唱…

学习笔记。。。

1.字符串的拼接 1.sprintf() 往字符串的前面或中间、后面拼接一个字符串。 2.strncpy()用来复制字符串的前n个字符 //dest为目标数组&#xff0c;src为源数组&#xff0c;n为要复制的字符个数 2.char* My_strncpy(char* dest, const char* src, int n) 3.char *strcat(ch…

web蓝桥杯真题:西游记之西天取经

代码&#xff1a; animation-iteration-count: infinite; 考点&#xff1a; animation-iteration-count n | indinite属性定义动画的播放次数。 值描述n定义动画播放次数的数值。infinite规定动画应该无限次播放。