某教育平臺專案開發之--使用SSM框架開發過程遇到的問題總結
本次開發一個系統,前端是Android端,互動方式用json。
一、關於@RequestBody
和@JsonIgnoreProperties(ignoreUnknown=true)
的問題
前端用json資料傳輸。json資料格式如下:
{
"mobileNum" : "13800138000",
“userName”:”df54df”,
"Password" : "123456"
}
後端用一個物件封裝傳遞過來的資料,需要用到一個註解@RequestBody
,這個註解的作用就是封裝前端傳遞過來的Json資料到緊跟該註解的物件,那麼會出現3種情況(假設封裝的物件是User user,並且要求json資料的命名與User裡面的屬性命名一致):
(1)User裡面的屬性與json資料的屬性一致(包括變數名和數量),那麼這是最理想的情況;
(2)User裡面的屬性比json資料的屬性多,但其他匹配,那麼User裡面的資料將被設定為預設值(如果是物件型,則是Null)
(3)User裡面的屬性比json資料的屬性少。這時候可以用@JsonIgnoreProperties(ignoreUnknown=true)
@JsonIgnoreProperties(ignoreUnknown = true)
@Table(name="user")
public class User extends Unique{
@Column(name="mobile_num")
private String mobileNum;
@Column(name="user_name")
private String userName;
@Column(name="password")
private String password;
@Column(name="has_card")
private int hasCard;
@Column(name="salt")
private String salt;
.....忽略以下getter、setter程式碼
}
二、關於無法正確解析前端傳來的json資料
注意提醒前端用的編碼方式跟後臺一樣,如果後端設定了json的格式是application/json;charset=UTF-8
,那麼前端也要一樣。在開發中,沒加@RequestBody
的時候,系統能進入對應的方法體,只是想要封裝json資料的物件獲取不到資料,但是加了@RequestBody
三、當User裡面的屬性比json資料的屬性少時,開發中又不想寫個拓展類,但是多餘的屬性(比如“type”)又在方法體起作用。例如:
type=0,進入註冊使用者的程式碼塊;type=1,進入找回密碼的程式碼塊,這時候的解決辦法就是:
@RequestMapping(value="/login/{type}",method= RequestMethod.POST)
public @ResponseBody String login(HttpServletRequest request, @PathVariable("type") String type,String timestamp, @RequestBody User user){
if("0".equals(type)){
//註冊使用者的程式碼塊
}else{
//找回密碼的程式碼塊
}
}
三、關於用@RequestBody封裝前端傳遞過來的JSON資料
這是我在開發過程中無意間在百度看到的,可以用下面兩種方法對前端的JSON資料進行封裝。
一、用Map
method(@RequestBody Map map) {
map.get("code");
}
二、用阿里巴巴的JSONObject (在開發書香校園APP的後端,我用的是這個,很實用,不必在擔心前面所說的三種情況了)
method(@RequestBody JSONObject jsonObj) {
jsonObj.getString("code");
}
聯想:
資料表裡面的欄位一般都對應一個POJO類的屬性,但是有些需求需要寫複合查詢語句,這樣必定設計到兩張表,select到的欄位可能是包含兩張表的某些內容,按照以往的做法,我會再寫一個VO類,但是現在找到一個方法解決這個問題,不用寫過多的VO類