出现 xx has no default (no arg) constructor 解决方法

devtools/2024/9/20 3:53:09/ 标签: Bug, Java, constructor, 构造函数

目录

  • 1. 问题所示
  • 2. 原理分析
  • 3. 解决方法

1. 问题所示

执行脱敏函数的时候,出现如下问题:

Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Class com.example.test.ChineseNameDesensitization$Serializer has no default (no arg) constructorat com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77)at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1300)at com.fasterxml.jackson.databind.SerializerProvider._createAndCacheUntypedSerializer(SerializerProvider.java:1447)at com.fasterxml.jackson.databind.SerializerProvider.findValueSerializer(SerializerProvider.java:544)at com.fasterxml.jackson.databind.SerializerProvider.findTypedValueSerializer(SerializerProvider.java:822)at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:308)at com.fasterxml.jackson.databind.ObjectMapper._writeValueAndClose(ObjectMapper.java:4568)at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString(ObjectMapper.java:3821)at com.example.test.test.main(test.java:82)

截图如下所示:

在这里插入图片描述

2. 原理分析

本着问题导向的分析,分析Bug的提示词

异常是由于Jackson库在序列化对象时发现了一个问题

  1. InvalidDefinitionException: Jackson库的一个异常类,用于指示在序列化或反序列化期间发现的问题。
  2. Class com.example.test.ChineseNameDesensitization$Serializer has no default (no arg) constructor: 异常消息指出问题所在,Jackson要求自定义的序列化器类必须有一个默认的(无参的)构造函数

解决方式有如下:

  1. 添加默认构造函数: 在ChineseNameDesensitization$Serializer类中添加一个无参的构造函数即可
public class Serializer {public Serializer() {// 默认构造函数}// 其他代码
}
  1. 使用内部静态类: 如果Serializer类是作为ChineseNameDesensitization类的内部静态类实现的,确保它是静态的
public class ChineseNameDesensitization {// 其他代码public static class Serializer {// 构造函数和其他代码}
}
  1. 使用@JsonSerialize注解: 如果Serializer类是用于特定字段或方法的自定义序列化器,可以考虑使用@JsonSerialize注解来指定它,将其与字段或方法相关联,并且不需要显示地在类中声明默认构造函数
@JsonSerialize(using = ChineseNameDesensitization.Serializer.class)
public class MyClass {// 字段和其他代码
}

选择哪种方法取决于代码结构和需求

3. 解决方法

本次采用无参构造函数的融入

// 脱敏处理器
class ChineseNameDesensitization {public static class Serializer extends JsonSerializer<String> {private int prefixKeep;private int suffixKeep;private String replacer;// 默认构造函数public Serializer() {// 这里可以设置默认的参数值,或者留空}// 带参数的构造函数public Serializer(int prefixKeep, int suffixKeep, String replacer) {this.prefixKeep = prefixKeep;this.suffixKeep = suffixKeep;this.replacer = replacer;}// 其他方法

最终截图如下:

在这里插入图片描述


http://www.ppmy.cn/devtools/26848.html

相关文章

数据结构——插入排序

基本思想&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 实际中我们玩扑克牌时&…

数据库语法复习

总结&#xff1a; DDL&#xff08;数据定义语言&#xff09; CREATE DATABASE&#xff1a;创建一个新的数据库。DROP DATABASE&#xff1a;删除一个数据库。CREATE TABLE&#xff1a;创建一个新的表。DROP TABLE&#xff1a;删除一个表。ALTER TABLE&#xff1a;修改表的结构&a…

为什么要学音视频?

一直都在说“科技改变生活”&#xff0c;现实告诉我们这是真的。 随着通信技术和 5G 技术的不断发展和普及&#xff0c;不仅拉近了人与人之间的距离&#xff0c;还拉近了人与物&#xff0c;物与物之间的距离&#xff0c;万物互联也变得触手可及。 基于此背景下&#xff0c;音…

使用 Lua 协程模拟 Golang 的 go defer 编程模式

封装 go 函数 在 使用 Lua 协程处理异步回调函数 中已经介绍 这里简要列下&#xff1a; 封装 go 函数---go 函数创建并启动一个协程 ---param _co_task function 函数原型 fun(_co:thread) function go(_co_task)local co coroutine.create(_co_task) -- 创建的协程是暂停的…

STL复习

vector STL详解及常见面试题_stl常见面试题-CSDN博客 C vector中resize()和reserve()区别_c vector resize和reserve区别-CSDN博客 释放vectro内存&#xff1a; map释放内存 deque&#xff1a; C STL deque 容器底层实现原理&#xff08;深度剖析&#xff09; - 知乎 (zhihu.…

Flask教程1:flask框架基础入门,路由、模板、装饰器

文章目录 一、 简介二、 概要 一、 简介 Flask是一个非常小的Python Web框架&#xff0c;被称为微型框架&#xff1b;只提供了一个稳健的核心&#xff0c;其他功能全部是通过扩展实现的&#xff1b;意思就是我们可以根据项目的需要量身定制&#xff0c;也意味着我们需要学习各…

全新桥隧坡安全监测解决方案,24h监测效率提升30%

4月26日&#xff0c;交通运输部党组书记、部长李小鹏在部务会上强调&#xff0c;要高度重视公路桥梁隧道结构监测工作&#xff0c;抓紧推进公路桥梁隧道结构监测系统建设&#xff0c;进一步健全完善公路桥梁隧道结构监测长效运行机制。 中海达积极参与公路桥梁隧道结构监测工作…

【Spring MVC】_SpringMVC项目返回静态页面

目录 1. 创建与设计前端页面 2. 返回HTML静态页面 2.1 示例1&#xff1a;使用RestController 2.2 示例2&#xff1a;使用Controller 3. RestController与Controller 在本专栏关于SpringMVC项目的相关文章中&#xff0c;已经介绍了操作HTTP请求的方式&#xff0c;包括多种传…

Type-C转音频(USB2.0数据传输)+PD充电芯片乐得瑞LDR6500/LDR6023

LDR6500 USB-C DRP 接口 USB PD 通信芯片概述 Type-C转音频(USB2.0数据传输)PD充电芯片乐得瑞LDR6500LDR6500是乐得瑞科技针对USB Type-C标准中的Bridge设备而开发的USB-C DRP&#xff08;Dual Role Port&#xff0c;双角色端口&#xff09;接口USB PD&#xff08;Power Deliv…

Glide添加token和userId

方法一&#xff1a; GlideUrl glideUrl new GlideUrl(url, new LazyHeaders.Builder().addHeader("userId", userId).addHeader("token", token).build());FutureTarget<File> target Glide.with(context).asFile().load(glideUrl).submit(); 方法…

Git和SVN有什么区别?

Git和SVN都是版本控制系统&#xff0c;它们都是用来帮助团队协同开发&#xff0c;管理代码版本的。但是&#xff0c;git和svn在实现方式&#xff0c;使用方法&#xff0c;特性等方面都存在一些差异 分布式 vs 集中式 这是二者之间最大的区别。Git是分布式版本控制系统&#xff…

Linux的vim下制作进度条

目录 前言&#xff1a; 回车和换行有区别吗&#xff1f; 回车和换行的区别展示&#xff08;这个我在Linux下演示&#xff09; 为什么会消失呢? 回车和换行的区别 为什么\r和\n产生的效果不同&#xff1f; 打印进度条&#xff1a; &#xff08;1&#xff09;打印字符串 …

基于AT89C52单片机的智能热水器控制系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/89242443?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤05 题 目 基于单片机的智能热水器系统 学 院 专 业 班 级 学 号 学生姓名 指导教师 完成日期…

.net6 webapi 部署到IIS

一、发布.net6 webapi 项目 1.1 visual studio 2022右键发布到文件夹。 二、增加IIS容器 2.1 控制面板 2.2 启用或关闭Windows功能 3.3 勾选Internet Information Services,点击确定进行安装 三、部署webapi到IIS 3.1 安装 dotnet-hosting-6.0.29-win.exe 3.2 创建应用…

鸿蒙OpenHarmony【轻量系统 运行】 (基于Hi3861开发板)

运行 联网配置 由于Hi3861为WLAN模组&#xff0c;您可以在版本编译及烧录后&#xff0c;通过如下操作&#xff0c;使开发板实现联网功能。 保持Windows工作台和Hi3861 WLAN模组的连接状态&#xff0c;确认串口终端显示正常。 复位Hi3861 WLAN模组&#xff0c;终端界面显示“…

linux安装docker

linux安装安装docker 1、linux安装docker1.1、官网安装文档1.2、下载docker安装包 2、安装docker 26.1.03、配置docker systemd服务 1、linux安装docker 1.1、官网安装文档 https://docs.docker.com/engine/install/binaries/ 1.2、下载docker安装包 官方下载链接&#xff…

jenkins教程

jenkins 一、简介二、下载安装三、配置jdk、maven和SSH四、部署微服务 一、简介 Jenkins是一个流行的开源自动化服务器&#xff0c;用于自动化软件开发过程中的构建、测试和部署任务。它提供了一个可扩展的插件生态系统&#xff0c;支持各种编程语言和工具。 Jenkins是一款开…

java-springmvc 01 补充 javaweb 三大组件Servlet,Filter、Listener(源码都是tomcat8.5项目中的)

01.JavaWeb三大组件指的是&#xff1a;Servlet、Filter、Listener,三者提供不同的功能 这三个在springmvc 运用很多 Servlet 01.Servlet接口&#xff1a; public interface Servlet {/*** 初始化方法* 实例化servlet之后&#xff0c;该方法仅调用一次 * init方法必须执行完…

selenium之document.querySelector()方法

document.querySelector()方法 1. 常用的三种获取元素的js方式 document.getElementById("");document.getElementsByClassName();document.getElementsByTagName(); var docdocument;var boxdoc.getElementById("box");var libox.getElementsByTagName(…

Oracle数据常驻程序内存优化【数据库实例优化系列三】

Oracle程序常驻程序内存优化【数据库实例优化系列二】-CSDN博客 在生产中,为提高用户的访问速度。可以将经常使用的表常驻与内存中。避免频繁的访问磁盘,降低IO。 虽然会占用一定的内存,但是效果还是很明显的。 如果不是用了,DBA可以将其删除。 一、数据缓冲池 数据库…