1. 程式人生 > >某教育平臺專案開發之--使用SSM框架開發過程遇到的問題總結

某教育平臺專案開發之--使用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)

簡單地忽略掉從JSON(由於在應用中沒有完全匹配的POJO)中獲得的所有“多餘的”屬性。例如:

@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類