SpringMVC @RequestBody屬性名大寫(xiě)字母注入失敗的解決
@RequestBody屬性名大寫(xiě)字母注入失敗
問(wèn)題描述
我現(xiàn)在有一個(gè)接口通過(guò)一個(gè)實(shí)體去接收一系列的參數(shù),前端傳參為一個(gè)JSON字符串,但是當(dāng)我的屬性名以大寫(xiě)字母開(kāi)頭,或者第二個(gè)字母是大寫(xiě)字母的時(shí)候,我發(fā)現(xiàn)后端接收不到參數(shù)值。
User實(shí)體:
import lombok.Data;
@Data
public class User{
?? ?private Long id;
?? ?private Integer pId;
?? ?private String Name;
?? ?//getter,setter由lombok自動(dòng)生成
?? ?//setId, setPId, setName
?? ?//getId, getPId, getName
}前端傳參:
{
? ? "id": 1,
? ? "pId": 70,
? ? "Name": "Jack"
}接口:
?? ?@PostMapping("/add")
?? ?public void add(@RequestBody User user) {
?? ??? ?System.out.println(user.getId()); // 1
?? ??? ?System.out.println(user.getName());//null
?? ??? ?System.out.println(user.getPId()); // null
?? ?}問(wèn)題分析
Name接收不到的原因是JavaBean的規(guī)范不允許出現(xiàn)這樣的屬性名,即首字母為大寫(xiě)的屬性名(如:Name, URL, SuV…),這種屬性名直接忽略不注入。
解決辦法是:在屬性上面添加注解@JsonProperty(value = “Name”)顯式指定名稱的對(duì)應(yīng)關(guān)系;
pId接收不到的原因是JavaBean的規(guī)范說(shuō)如果第一個(gè)字母是小寫(xiě),第二個(gè)字母大寫(xiě)的情況(如:pId, sUV…),在生成setter/getter的時(shí)候直接在前面加上set/get,比如pId的setter/getter是setpId()/getpId(),所以 pId在注入的時(shí)候會(huì)尋找setpId()方法,而不是setPId()。
所以解決方案是:1.在屬性上面加注解@JsonProperty(value = “pId”),2.不使用lombok, 手動(dòng)寫(xiě)setter -> setpId()
總結(jié):以上兩種類型名稱注入失敗的原因都是因?yàn)镴ackson(Spring使用的JSON處理工具)遵守了JavaBean的規(guī)范導(dǎo)致的,Jackson給的方案就是通過(guò)@JsonProperty顯式指定名稱的對(duì)應(yīng)關(guān)系。
解決方案
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonProperty;
@Data
public class User{
?? ?private Long id;
?? ?
?? ?@JsonProperty(value = "pId")
?? ?private Integer pId;
?? ?
?? ?@JsonProperty(value = "Name")
?? ?private String Name;
?? ?//getter,setter由lombok自動(dòng)生成
?? ?//setId, setPId, setName
?? ?//getId, getPId, getName
}import com.fasterxml.jackson.annotation.JsonProperty;
public class User{
?? ?private Long id;
?? ?private Integer pId;
?? ?
?? ?@JsonProperty(value = "Name")
?? ?private String Name;
?? ?public void setpId(){
?? ??? ?//...
?? ?}
?? ?public Integer getpId(){
?? ??? ?//...
?? ?}
?? ?//other setters,getters
?? ?//...
}@RequestBody時(shí)第二個(gè)字母大寫(xiě),映射不到
記錄一下遇到的一個(gè)問(wèn)題, 賊難受
controller
/**
* 添加
*
* @param requestNavigationTagVO
* @return
*/
@PostMapping("/add")
public JsonData add(@RequestBody RequestNavigationTagVO requestNavigationTagVO) {
navigationTagService.add(requestNavigationTagVO);
return JsonData.ok();
}
RequestNavigationTagVO
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public class RequestNavigationTagVO {
/**
* id
*/
private Long id;
/**
* 所屬導(dǎo)航id
*/
@NotNull(groups = {AddNavigationTag.class, ModifyNavigationTag.class}, message = "所屬導(dǎo)航id不能為空")
private Long pId;
/**
* 標(biāo)簽名稱
*/
@NotBlank(groups = {AddNavigationTag.class, ModifyNavigationTag.class}, message = "標(biāo)簽名稱不能為空")
private String name;
/**
* 排序
*/
@NotNull(groups = {AddNavigationTag.class, ModifyNavigationTag.class}, message = "排序不能為空")
private Integer sort;
}
postman調(diào)接口
{
"pId": 654577072911111,
"name":"中餐",
"sort":1
}
這是日志拿到的數(shù)據(jù),

可以看到拿不到pId數(shù)據(jù)(p_id的駝峰寫(xiě)法),
原因: 這里使用的@Data注解(省去了get和set方法)
public Long getPId() {
...
}
public void setPId(Long PId) {
...
}

而javaBean的規(guī)范導(dǎo)致json傳參首字母大寫(xiě)將永遠(yuǎn)獲取不到
解決辦法
1,不去使用首字目大寫(xiě)或第二個(gè)字母大寫(xiě)的參數(shù)
2,自己生成get和set方法

3,使用@JsonProperty注解
@JsonProperty("pId")
private Long pId;
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot如何使用@Value取配置文件中的map配置
這篇文章主要介紹了SpringBoot如何使用@Value取配置文件中的map配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
Spring Cloud Gateway 如何修改HTTP響應(yīng)信息
這篇文章主要介紹了Spring Cloud Gateway 修改HTTP響應(yīng)信息的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java中獲取時(shí)間戳的三種方式對(duì)比實(shí)現(xiàn)
這篇文章主要介紹了Java中獲取時(shí)間戳的三種方式對(duì)比實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
java使用Socket實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了java使用Socket實(shí)現(xiàn)文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
JAVA實(shí)現(xiàn)用戶抽獎(jiǎng)功能(附完整代碼)
這篇文章主要給大家介紹了關(guān)于JAVA實(shí)現(xiàn)用戶抽獎(jiǎng)功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11

