實體類如下:
@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 賦初值(其實不能叫初值,該叫‘永久值’),
@Value
@NoArgsConstructor
public class Search{String value; //報錯,Variable 'value' might not have been initializedboolean fuzzy = true;
}
全參 會警告告訴你不要給 member field 賦初值。
@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.
實體類如下:
@Value
@NoArgsConstructor
public class Search{String value = "";boolean fuzzy = true;
}
為了編譯 compile 不爆紅我們只好這樣。
其實這樣寫等于白寫了,連搜索內容都是寫死的你想想,啥功能都沒實現。不管你前端傳啥,后端的實例 instance 都永遠是是 Student (value=, fuzzy=true)
. 我們就只先做實驗,非得這么寫。會發生什么呢?
前端傳參:
{"value":"abc","fuzzy":true
}
能通過,但沒什么用。
情況2
@Value
Student {String value;boolean fuzzy;public Student(String value, boolean fuzzy) {this.value = value;this.fuzzy = fuzzy;}
}
前端:
{"value":"abc","fuzzy":true
}
此時并沒有空參構造器,但并沒有報這個錯。可見那些抄來抄去的文章是多么的沒價值。
情況3
@AllArgsConstructor 是非常智能的。事實上它并不是“全參構造器”的意思!! 假設一個賦值了一個沒賦值:
@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 …