關於@JsonProperty,@NotNull,@JsonIgnore的具體使用
前情摘要
上回說道,小明同學用@JsonProperty解決瞭,在接口通訊中的Json反序列化問題。
經過研究,小明發現@JsonProperty在特定場景下,還有更人性化的作用。
並且在項目中相繼使用瞭@JsonIgnore和@NotNull兩兄弟。下面繼續場景分析。
場景分析一
小明做瞭一個web表單,用來填寫並保存數據,後臺寫restful接口接收數據並保存。
寫完之後讓老大review的時候,自信滿滿的小明,又收到瞭很多comment。
小明看到瞭這些comment發現確實有不足之處,比如表單裡的有些數據是必須不為空的,雖然在頁面上加上瞭強校驗(Js校驗),但是後臺接口是對外開放的restful接口,別人不走頁面直接訪問接口存儲數據,這時候頁面的校驗就顯得很尷尬瞭,小明又想這好辦啊,直接拿接收到的參數進行非空判斷不就行瞭麼,其實也是可以的,但是小明在研究@JsonProperty的時候發現@NotNull正好解決這個問題。
代碼展示如下:
Student類
public class Student { @JsonProperty(value="real_name") private String name ; @NotNull(message="idcard is not null") private String idCard; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getIdCard() { return idCard; } public void setIdCard(String idCard) { this.idCard = idCard; } }
StudentController.java
(註:這裡為瞭測試方便未按照標準的restApi書寫,如需學習標準的restful接口風格請移步百度。請見諒)
@RestController public class StudentController { @RequestMapping(value="/student",method=RequestMethod.POST) public Student save(@RequestBody @Valid Student student) { return student; } }
Postman測試如下:
(條件是:正常輸入real_name和idCard,返回結果正常)
Postman測試結果如下
(條件:隻寫real_name,不填寫idCard。報錯)
註意接口書寫時,用@RequestBody接收輸入參數時,這時候也需要匹配你預先定義的@JsonProperty的值。
參考real_name.並且,在參數前需要加上@Valid,你定義的@NotNull校驗才會生效。
@JsonProperty(value="real_name")
private String name ;
場景分析二
idCard為用戶的敏感信息,在接口返回數據中不能展示出來,以免用戶敏感信息直接暴露在外。
這時候,小明想到瞭另外一個註解,@JsonIgnore,在Student對象序列化為json數據的返回的時候,忽略該屬性。
代碼及測試如下:
@JsonProperty(value="real_name") private String name ; @JsonIgnore private String idCard;
Postman測試如下
(條件:正常輸入real_name和idCard,觀察返回數據,隻包含real_name)
場景分析三
在場景二中提到使用@JsonIgnore可以讓接口在返回數據的時候不序列化一些屬性。
但是小明又想瞭,若場景一和場景二結合使用,及在用戶輸入表單保存數據的時候,某個字段不能為空,並且返回數據的時候又不能包含該屬性,是不是可以使用組合註解@JsonIngore和@NotNull呢,
代碼和測試結果如下:
@JsonProperty(value="real_name") private String name ; @JsonIgnore @NotNull(message="idcard is not null") private String idCard;
Postman測試結果如下
(條件:idCard及為上述特殊字段,結果報錯)
經過嘗試,小明想到瞭如下解決方案,代碼及測試結果如下:
@JsonProperty(value="real_name") private String name ; @JsonProperty(access=Access.WRITE_ONLY) @NotNull(message="idcard is not null") private String idCard;
Postman測試結果如下
(條件:用JsonProperty代替JsonIgnore)
成功實現需求。
場景分析四
由於小明公司秉承盡最大努力少使用第三方的資源的原因,項目中關於JsonObject相關的jar都是使用的org.json,並未使用阿裡的fastjson,如果項目使用的是fastjson,再使用上述的註解就不起作用瞭,它有自己的一套註解來解決上述問題,
如:@JSONField,具體可參考com.alibaba.fastjson.annotation包。感興趣的可以查一下。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- @RequestBody時第二個字母大寫,映射不到的解決
- Java開發中POJO和JSON互轉時如何忽略隱藏字段的問題
- fastjson轉換對象實體@JsonProperty不生效問題及解決
- @Valid註解的作用及@Valid註解與@Validated的區別
- 解決get請求入參@NotNull驗證不生效問題