SpringBoot中@Pattern注解對(duì)時(shí)間格式校驗(yàn)方式
SpringBoot @Pattern注解對(duì)時(shí)間格式校驗(yàn)
1.需求背景
有一個(gè)需求,在前端傳過(guò)來(lái)的時(shí)間格式的字符串進(jìn)行校驗(yàn),是否符合"yyyy-MM-dd HH:mm:ss",在SpringBoot中當(dāng)然可以用@Datetimeformat注解來(lái)進(jìn)行驗(yàn)證,但字段的屬性得用Date類型,由于我的項(xiàng)目中該字段用了String類型,需要對(duì)類型進(jìn)行轉(zhuǎn)換不太符合要求,所有用到了@Pattern注解。
在實(shí)體類的字段名上添加@Pattern注解,有個(gè)屬性regexp,該屬性的值就是正則表達(dá)式。
"yyyy-MM-dd HH:mm:ss"的正則表達(dá)式如下:
"^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$"
我們還需用到@Validated注解,該注解使用在controller層的方法參數(shù)中,只有使用該注解,@pattern中的時(shí)間格式校驗(yàn)才起作用,這一點(diǎn)尤其重要。
2.實(shí)現(xiàn)案例
entity:
//刪除時(shí)間 @Pattern(regexp = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$") private String deletedAt;
//刪除時(shí)間 @Pattern(regexp = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$") private String deletedAt;
controller:
/** * 添加設(shè)備類別 */ @ApiOperation(value = "添加設(shè)備類別",notes="傳入?yún)?shù)是category對(duì)象") @PostMapping("/category") public int addCategory(@Validated Category category){ return iCategory.addCategory(category); }
測(cè)試結(jié)果:
當(dāng)輸入的時(shí)間為2020-08-26或2020/08/26 11:22:33,時(shí)間格式不符合"yyyy-MM-dd HH:mm:ss",就會(huì)出現(xiàn)報(bào)錯(cuò),如下所示:
只有輸入正確格式的數(shù)據(jù),才能插入成功:
@Pattern的用法
把這個(gè)注解加在entity的參數(shù)上,可以選擇分類也可以默認(rèn);
關(guān)于注解中需要傳的參數(shù):一般默認(rèn)就填入正則表達(dá)式即可,但是java中字符串需要轉(zhuǎn)義,這個(gè)需要注意一下。
@Pattern(regexp = "\\w+$") private String userName;
在user傳參或者controller層中的添加@Validated注解進(jìn)行調(diào)用
舉個(gè)栗子:
public void addUser(@Validated User user){...}
下面是常用的正則表達(dá)式
- 匹配首尾空格的正則表達(dá)式:(^\s*)|(\s*$)
- 整數(shù)或者小數(shù):^[0-9]+\.{0,1}[0-9]{0,2}$
- 只能輸入數(shù)字:"^[0-9]*$"。
- 只能輸入n位的數(shù)字:"^\d{n}$"。
- 只能輸入至少n位的數(shù)字:"^\d{n,}$"。
- 只能輸入m~n位的數(shù)字:。"^\d{m,n}$"
- 只能輸入零和非零開(kāi)頭的數(shù)字:"^(0|[1-9][0-9]*)$"。
- 只能輸入有兩位小數(shù)的正實(shí)數(shù):"^[0-9]+(.[0-9]{2})?$"。
- 只能輸入有1~3位小數(shù)的正實(shí)數(shù):"^[0-9]+(.[0-9]{1,3})?$"。
- 只能輸入非零的正整數(shù):"^\+?[1-9][0-9]*$"。
- 只能輸入非零的負(fù)整數(shù):"^\-[1-9][]0-9"*$。
- 只能輸入長(zhǎng)度為3的字符:"^.{3}$"。
- 只能輸入由26個(gè)英文字母組成的字符串:"^[A-Za-z]+$"。
- 只能輸入由26個(gè)大寫英文字母組成的字符串:"^[A-Z]+$"。
- 只能輸入由26個(gè)小寫英文字母組成的字符串:"^[a-z]+$"。
- 只能輸入由數(shù)字和26個(gè)英文字母組成的字符串:"^[A-Za-z0-9]+$"。
- 只能輸入由數(shù)字、26個(gè)英文字母或者下劃線組成的字符串:"^\w+$"。
- 驗(yàn)證用戶密碼:"^[a-zA-Z]\w{5,17}$"正確格式為:以字母開(kāi)頭,長(zhǎng)度在6~18之間,只能包含字符、數(shù)字和下劃線。
- 驗(yàn)證是否含有^%&',;=?$\"等字符:"[^%&',;=?$\x22]+"。
- 只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"
- 驗(yàn)證Email地址:"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"。
- 驗(yàn)證InternetURL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。
- 驗(yàn)證電話號(hào)碼:"^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$"正確格式為:"XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
- 驗(yàn)證身份證號(hào)(15位或18位數(shù)字):"^\d{15}|\d{18}$"。
- 驗(yàn)證一年的12個(gè)月:"^(0?[1-9]|1[0-2])$"正確格式為:"01"~"09"和"1"~"12"。
- 驗(yàn)證一個(gè)月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式為;"01"~"09"和"1"~"31"。
- 匹配中文字符的正則表達(dá)式: [\u4e00-\u9fa5]
- 匹配雙字節(jié)字符(包括漢字在內(nèi)):[^\x00-\xff]
- 應(yīng)用:計(jì)算字符串的長(zhǎng)度(一個(gè)雙字節(jié)字符長(zhǎng)度計(jì)2,ASCII字符計(jì)1)
- String.prototype.len=function(){return this.replace(/[^\x00-\xff]/g,"aa").length;}
- 匹配空行的正則表達(dá)式:\n[\s| ]*\r
- 匹配html標(biāo)簽的正則表達(dá)式:<(.*)>(.*)<\/(.*)>|<(.*)\/>
- 中文字母數(shù)字下劃線:^[a-zA-Z0-9_\u4e00-\u9fa5]*$
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringBoot使用Jackson配置全局時(shí)間日期格式
- springboot 返回json格式數(shù)據(jù)時(shí)間格式配置方式
- SpringBoot利用jackson格式化時(shí)間的三種方法
- springboot2.0 配置時(shí)間格式化不生效問(wèn)題的解決
- SpringBoot中時(shí)間類型 序列化、反序列化、格式處理示例代碼
- 關(guān)于Springboot日期時(shí)間格式化處理方式總結(jié)
- springboot json時(shí)間格式化處理的方法
- springboot項(xiàng)目中統(tǒng)一時(shí)間格式處理方法
相關(guān)文章
Spring如何基于aop實(shí)現(xiàn)事務(wù)控制
這篇文章主要介紹了Spring如何基于aop實(shí)現(xiàn)事務(wù)控制,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03JavaWeb Session失效時(shí)間設(shè)置方法
這篇文章主要介紹了JavaWeb Session失效時(shí)間設(shè)置方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(30)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07java實(shí)現(xiàn)適用于安卓的文件下載線程類
本文給大家分享的是java實(shí)現(xiàn)適用于安卓的文件下載線程類的代碼,有需要的小伙伴可以參考下2015-07-07實(shí)現(xiàn)分布式WebSocket集群的方法
本文總結(jié)出了幾個(gè)實(shí)現(xiàn)分布式WebSocket集群的辦法,從zuul到spring cloud gateway的不同嘗試,總結(jié)出了這篇文章,希望能幫助到某些人,并且能一起分享這方面的想法與研究2022-03-03