- 問題描述:
我現在有一個接口通過一個實體(@RequestBody)去接收一系列的參數,前端傳參為一個JSON字符串,但是當我的屬性名以大寫字母開頭(有的中間還有下劃線),或者第二個字母是大寫字母的時候,我發現后端接收不到參數值。
- User實體:
import lombok.Data;@Data
public class User{private Long id;private Integer pId;private Integer USER_CODE;private String USER_NAME;
}
- 前端傳參:
{"id": 1,"pId": 11,"USER_CODE": 70,"USER_NAME": "Jack"
}
- 接口:
@PostMapping("/add")public void add(@RequestBody User user) {System.out.println(user.getId()); // 1System.out.println(user.getpId()); // nullSystem.out.println(user.getUSER_NAME());//nullSystem.out.println(user.getUSER_CODE()); // null}
- 問題分析:
Name接收不到的原因是JavaBean的規范不允許出現這樣的屬性名,即首字母為大寫的屬性名(如:Name, URL, SuV…),這種屬性名直接忽略不注入。解決辦法是:在屬性上面添加注解@JsonProperty(value = “Name”)顯式指定名稱的對應關系;
pId接收不到的原因是JavaBean的規范說如果第一個字母是小寫,第二個字母大寫的情況(如:pId, sUV…),在生成setter/getter的時候直接在前面加上set/get,比如pId的setter/getter是setpId()/getpId(),所以 pId在注入的時候會尋找setpId()方法,而不是setPId()(這個是由lombok生成的)。所以解決方案是:
1.在屬性上面加注解@JsonProperty(value = “pId”),
2.不使用lombok, 手動寫setter -> setpId()
?總結:以上兩種類型名稱注入失敗的原因都是因為Jackson(Spring使用的JSON處理工具)遵守了JavaBean的規范導致的,Jackson給的方案就是通過@JsonProperty顯式指定名稱的對應關系。
- 解決方案:
1.使用?lombok
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonProperty;@Data
public class User{private Long id;@JsonProperty(value = "pId")private Integer pId;@JsonProperty(value = "USER_CODE")private Integer USER_CODE;@JsonProperty(value = "USER_NAME")private String USER_NAME;}
2.不使用?lombok?
public class User {private Long id;@JsonProperty(value = "pId")private Integer pId;@JsonProperty(value = "USER_CODE")private Integer USER_CODE;@JsonProperty(value = "USER_NAME")private String USER_NAME;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public Integer getpId() {return pId;}public void setpId(Integer pId) {this.pId = pId;}public Integer getUSER_CODE() {return USER_CODE;}public void setUSER_CODE(Integer USER_CODE) {this.USER_CODE = USER_CODE;}public String getUSER_NAME() {return USER_NAME;}public void setUSER_NAME(String USER_NAME) {this.USER_NAME = USER_NAME;}
}
?參考文章:
SpringMVC @RequestBody 屬性名大寫字母注入失敗解決方案_大寫開頭參數傳不進去怎么辦-CSDN博客
?
?
?
?