实体类如下:
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 ...