根本原因是异常类继承自Exception/RuntimeException且未提供无参构造函数;解决方法包括:添加public无参构造、用@JsonCreator标注带参构造、改用专用错误响应类、或修正非静态内部类问题。

Java中用Jackson把JSON反序列化成自定义异常类时,报“Missing default constructor”或类似提示(如no Creators, like default constructor, exist),根本原因是:异常类通常继承自Exception或RuntimeException,而这些父类的构造函数都带参数(比如String message或String message, Throwable cause),且子类往往没显式提供无参构造函数——这恰好踩中Jackson默认反序列化机制的硬性要求。
补一个无参构造函数(最直接)
只要你的异常类允许修改,加一个public MyException() {}即可。Jackson就能用它创建空实例,再通过setter或字段赋值填充属性。
- 注意:如果异常类有final字段,或依赖构造参数做校验/初始化,加无参构造后需确保逻辑仍健壮(例如在setter里补校验,或让字段可为空)
- 若已有带参构造(如
MyException(String msg)),保留它不影响反序列化;Jackson会优先用无参构造+后续设值
用 @JsonCreator 指定带参构造(推荐用于不可改源码场景)
当异常类来自第三方库、或你不能加无参构造时,用@JsonCreator和@JsonProperty标记一个已有构造函数:
- 例如:
public MyException(@JsonProperty("message") String message) - 确保每个参数都有
@JsonProperty注解,否则Jackson无法匹配JSON字段名 - 如果构造函数参数多于JSON字段数(比如还有
cause),可配合@JsonSetter(nulls = Nulls.SKIP)或配置DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES = false
避免反序列化异常类本身(更合理的实践)
从设计角度看,异常类一般不作为数据传输对象(DTO)使用。实际项目中,建议:
立即学习“Java免费学习笔记(深入)”;
- 定义专用的错误响应类(如
ErrorResponse),含code、message、timestamp等字段,它天然适合JSON序列化 - 服务端抛出异常时,统一用全局异常处理器(如
@ControllerAdvice)将其转为ErrorResponse返回给前端 - 客户端收到错误响应后,按需构造本地异常,而不是直接反序列化成服务端的异常类
检查是否误用了非静态内部异常类
如果异常类是某个类的非静态内部类(如Outer.SomeException),即使加了无参构造也会失败——因为非静态内部类隐式依赖外部类实例,Jackson无法提供该上下文。
- 解决方案:把内部异常类改为
static class SomeException extends Exception - 或者干脆移到单独的.java文件中,作为顶级类存在


















