Spring Boot項目中使用@RequestBody接收請求數據,前端通過json格式傳遞數據,發現獲取不到所發送的部分數據
- 實體類
@ApiModel(value = "碼錶分類")
@Data
public class ClassVo {
@ApiModelProperty(value = "碼錶分類編號", required = true)
private String cId;
@ApiModelProperty(value = "碼錶分類名", required = true)
private String name;
@ApiModelProperty(value = "備註", required = false)
private String memo;
}
- 響應方法
獲得請求數據,以json格式再返回’
@PostMapping(value = "/class")
public CommonreturnType insertClass(@RequestBody ClassVo classVo){
return CommonreturnType.create(classVo);
}
- 請求數據
{
"cId": "01",
"name": "測試",
"memo": "測試"
}
- 返回結果
{
"status": "success",
"data": {
"cId": null,
"name": "測試",
"memo": "測試"
}
}
很驚奇的發現,傳入的參數cId並沒有被解析到實體類中,返回結果中爲null
- 多次測試後發現:
如果參數第一個字母爲小寫,第二個字母爲大寫,就不能正常的從JSON中解析出來,如:cId,mName,aBcd
等參數都不能被正常的解析,而myName,abCd
等最前面不止一個字母小寫的情況是可以用的
- 結論:@RequestBody接收的實體類中的屬性名如果是第一個字母小寫第二個字母大寫的情況,不能正常的從JSON轉換成實例類屬性
- 解決方案:
- 方案一:改名字,第二個大寫的改成小寫就行了(實際開發中改名字使名字不符合駝峯命名法不恰當)
- 方案二:加上@JsonProperty註解,指定某個方法JSON轉換時的名字,上述實體類將修改爲
@ApiModel(value = "碼錶分類")
@Data
public class ClassVo {
@ApiModelProperty(value = "碼錶分類編號", required = true)
private String cId;
@ApiModelProperty(value = "碼錶分類名", required = true)
private String name;
@ApiModelProperty(value = "備註", required = false)
private String memo;
@JsonProperty(value = "cId")
public String getcId() {
return cId;
}
@JsonProperty(value = "cId")
public void setcId(String cId) {
this.cId = cId;
}
}
因爲使用的lambok的@Data註解沒有顯式的setter和getter,所以自己寫一個setter和getter,然後在上面註明解析時的名字就可以了