spring.HttpMessageNotReadableException: JSON parse error

实体类如下:

java 复制代码
@Value
public class Search{
    //搜索内容
	String value;
	//是否模糊搜索
	boolean fuzzy = true; //其实这样写并不是"默认"模糊搜索,而是"一定是"模糊搜索
}

spring.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of com.erato.xxx.Student (although at least one Creator exists): cannot deserialize from Object value (no-delegate- or property based Creater); nested exception is com.fastetxml.jackson.databind.exc.MismatchedInputException: ...

去网上一搜,全都在说没有是因为没有空参构造器 NoArgsConstructor。实际上这只是表面。 有时候即使没有空参构造器也无所谓。

上面情况的问题在于,@value 会给两个成员变量 member field 都加上 final.

首先明确一下 java 基础知识点:如果 class 里只有两个 final 的成员变量 member field. 那 空参 和 全参 两个构造器是没法共存的。

空参会警告告诉你给 member field 赋初值(其实不能叫初值,该叫'永久值'),

java 复制代码
@Value
@NoArgsConstructor
public class Search{
	String value; //报错,Variable 'value' might not have been initialized
	boolean fuzzy = true;
}

全参 会警告告诉你不要给 member field 赋初值。

java 复制代码
@Value
@AllArgsConstructor
public class Search{
	String value = ""; 
	boolean fuzzy = true;
	public Student(String value, boolean fuzzy){
		this.value = value;//报错 cannnot assign a value to final variable 'value'
		this.fuzzy = fuzzy;
	}
}

情况1

我们来看看让实体类有 no args constructor.

实体类如下:

java 复制代码
@Value
@NoArgsConstructor
public class Search{
	String value = "";
	boolean fuzzy = true;
}

为了编译 compile 不爆红我们只好这样。

其实这样写等于白写了,连搜索内容都是写死的你想想,啥功能都没实现。不管你前端传啥,后端的实例 instance 都永远是是 Student (value=, fuzzy=true). 我们就只先做实验,非得这么写。会发生什么呢?

前端传参:

json 复制代码
{
	"value":"abc",
	"fuzzy":true
}

能通过,但没什么用。

情况2

java 复制代码
@Value
Student {
	String value;
	boolean fuzzy;
	public Student(String value, boolean fuzzy) {
		this.value = value;
		this.fuzzy = fuzzy;
	}
}

前端:

json 复制代码
{
	"value":"abc",
	"fuzzy":true
}

此时并没有空参构造器,但并没有报这个错。可见那些抄来抄去的文章是多么的没价值。

情况3

@AllArgsConstructor 是非常智能的。事实上它并不是"全参构造器"的意思!! 假设一个赋值了一个没赋值:

java 复制代码
@Value
@AllArgsConstructor
Student {
	String value;
	boolean fuzzy = true;
	public Student(String value, boolean fuzzy) {
		this.value = value;
		this.fuzzy = fuzzy;
	}
}

ctrl+F12 我们会看到只添了一个构造方法 , **Student(String value).

**

你前端不管传几个都会报错:

spring.HttpMessageNotReadableException: JSON parse error: Cannot construct ...

相关推荐
测试修炼手册3 分钟前
[测试技术] 深入理解 JSON Web Token (JWT)
前端·json
九转成圣1 小时前
Java 性能优化实战:如何将海量扁平数据高效转化为类目字典树?
java·开发语言·json
直奔標竿1 小时前
Java开发者AI转型第二十七课!Spring AI 个人知识库实战(六)——全栈闭环收官,解锁前端流式渲染终极技巧
java·开发语言·前端·人工智能·后端·spring
小袁拒绝摆烂4 小时前
多表关联大平层转JSON树形结构
java·json
空中海7 小时前
Spring Cloud 专家级面试题库
spring·spring cloud·面试
直奔標竿8 小时前
SpringAI + RAG + MCP + Agent 零基础全栈实战(完结篇)| 27课完整汇总,Java开发者AI转型必看
java·开发语言·人工智能·spring boot·后端·spring
云烟成雨TD8 小时前
Spring AI 1.x 系列【31】向量数据库:进阶使用指南
java·人工智能·spring
学术阿凡提9 小时前
Spring Boot 集成 Fastjson2 完整教程:从入门到避坑
spring boot·安全·json
LIUAWEIO9 小时前
鸽鸽工具网:免费在线工具大全,打开网页即用
人工智能·安全·ai·json
counting money10 小时前
Spring框架基础(依赖注入-全注解形式)
java·数据库·spring