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

1. 问题所示

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

Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Class com.example.test.ChineseNameDesensitization$Serializer has no default (no arg) constructor
	at 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;
        }

		// 其他方法

最终截图如下:

在这里插入图片描述

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农研究僧

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值