關(guān)于@JsonProperty,@NotNull,@JsonIgnore的具體使用
前情摘要
上回說道,小明同學(xué)用@JsonProperty解決了,在接口通訊中的Json反序列化問題。
經(jīng)過研究,小明發(fā)現(xiàn)@JsonProperty在特定場景下,還有更人性化的作用。
并且在項(xiàng)目中相繼使用了@JsonIgnore和@NotNull兩兄弟。下面繼續(xù)場景分析。
場景分析一
小明做了一個(gè)web表單,用來填寫并保存數(shù)據(jù),后臺寫restful接口接收數(shù)據(jù)并保存。
寫完之后讓老大review的時(shí)候,自信滿滿的小明,又收到了很多comment。
小明看到了這些comment發(fā)現(xiàn)確實(shí)有不足之處,比如表單里的有些數(shù)據(jù)是必須不為空的,雖然在頁面上加上了強(qiáng)校驗(yàn)(Js校驗(yàn)),但是后臺接口是對外開放的restful接口,別人不走頁面直接訪問接口存儲(chǔ)數(shù)據(jù),這時(shí)候頁面的校驗(yàn)就顯得很尷尬了,小明又想這好辦啊,直接拿接收到的參數(shù)進(jìn)行非空判斷不就行了么,其實(shí)也是可以的,但是小明在研究@JsonProperty的時(shí)候發(fā)現(xiàn)@NotNull正好解決這個(gè)問題。
代碼展示如下:
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
(注:這里為了測試方便未按照標(biāo)準(zhǔn)的restApi書寫,如需學(xué)習(xí)標(biāo)準(zhǔn)的restful接口風(fēng)格請移步百度。請見諒)
@RestController public class StudentController { @RequestMapping(value="/student",method=RequestMethod.POST) public Student save(@RequestBody @Valid Student student) { return student; } }
Postman測試如下:
(條件是:正常輸入real_name和idCard,返回結(jié)果正常)
Postman測試結(jié)果如下
(條件:只寫real_name,不填寫idCard。報(bào)錯(cuò))
注意接口書寫時(shí),用@RequestBody接收輸入?yún)?shù)時(shí),這時(shí)候也需要匹配你預(yù)先定義的@JsonProperty的值。
參考real_name.并且,在參數(shù)前需要加上@Valid,你定義的@NotNull校驗(yàn)才會(huì)生效。
@JsonProperty(value="real_name")
private String name ;
場景分析二
idCard為用戶的敏感信息,在接口返回?cái)?shù)據(jù)中不能展示出來,以免用戶敏感信息直接暴露在外。
這時(shí)候,小明想到了另外一個(gè)注解,@JsonIgnore,在Student對象序列化為json數(shù)據(jù)的返回的時(shí)候,忽略該屬性。
代碼及測試如下:
@JsonProperty(value="real_name") private String name ; @JsonIgnore private String idCard;
Postman測試如下
(條件:正常輸入real_name和idCard,觀察返回?cái)?shù)據(jù),只包含real_name)
場景分析三
在場景二中提到使用@JsonIgnore可以讓接口在返回?cái)?shù)據(jù)的時(shí)候不序列化一些屬性。
但是小明又想了,若場景一和場景二結(jié)合使用,及在用戶輸入表單保存數(shù)據(jù)的時(shí)候,某個(gè)字段不能為空,并且返回?cái)?shù)據(jù)的時(shí)候又不能包含該屬性,是不是可以使用組合注解@JsonIngore和@NotNull呢,
代碼和測試結(jié)果如下:
@JsonProperty(value="real_name") private String name ; @JsonIgnore @NotNull(message="idcard is not null") private String idCard;
Postman測試結(jié)果如下
(條件:idCard及為上述特殊字段,結(jié)果報(bào)錯(cuò))
經(jīng)過嘗試,小明想到了如下解決方案,代碼及測試結(jié)果如下:
@JsonProperty(value="real_name") private String name ; @JsonProperty(access=Access.WRITE_ONLY) @NotNull(message="idcard is not null") private String idCard;
Postman測試結(jié)果如下
(條件:用JsonProperty代替JsonIgnore)
成功實(shí)現(xiàn)需求。
場景分析四
由于小明公司秉承盡最大努力少使用第三方的資源的原因,項(xiàng)目中關(guān)于JsonObject相關(guān)的jar都是使用的org.json,并未使用阿里的fastjson,如果項(xiàng)目使用的是fastjson,再使用上述的注解就不起作用了,它有自己的一套注解來解決上述問題,
如:@JSONField,具體可參考com.alibaba.fastjson.annotation包。感興趣的可以查一下。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java多線程局域網(wǎng)聊天室的實(shí)現(xiàn)
在學(xué)習(xí)了一個(gè)學(xué)期的java以后,搞了一個(gè)多線程的聊天室,熟悉了一下服務(wù)器和客戶機(jī)的操作。感興趣的小伙伴們可以參考一下2021-06-06Java移位運(yùn)算符詳解實(shí)例(小結(jié))
這篇文章主要介紹了Java移位運(yùn)算符詳解實(shí)例(小結(jié)),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12SpringBoot集成yitter-idgenerator(雪花漂移)分布式Id自增的實(shí)現(xiàn)
本文主要介紹了SpringBoot集成yitter-idgenerator(雪花漂移)分布式Id自增的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01SpringBoot整合Spring Security的詳細(xì)教程
這篇文章主要介紹了SpringBoot整合Spring Security的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08為spring get請求添加自定義的參數(shù)處理操作(如下劃線轉(zhuǎn)駝峰)
這篇文章主要介紹了為spring get請求添加自定義的參數(shù)處理操作(如下劃線轉(zhuǎn)駝峰),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09SpringBoot詳細(xì)講解多個(gè)配置文件的配置流程
SpringBoot項(xiàng)目是一個(gè)標(biāo)準(zhǔn)的Maven項(xiàng)目,它的配置文件需要放在src/main/resources/下,其文件名必須為application,其存在兩種文件形式,分別是properties和yaml(或者yml)文件2022-06-06Java編程中的防轉(zhuǎn)義和轉(zhuǎn)義技巧匯總
在編程過程中,我們常常需要處理特殊字符和特定上下文,以確保生成的內(nèi)容在正確的環(huán)境中能夠被解析和顯示,本文將介紹一些常見的防轉(zhuǎn)義或者轉(zhuǎn)義處理的編程技巧,需要的可以參考一下2023-07-07Java實(shí)現(xiàn)支付寶之第三方支付寶即時(shí)到賬支付功能
這篇文章主要介紹了Java實(shí)現(xiàn)支付寶之第三方支付寶即時(shí)到賬支付功能的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07