您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關(guān)使用Spring怎么實(shí)現(xiàn)請(qǐng)求參數(shù)校驗(yàn)功能,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
SpringMVC支持的數(shù)據(jù)校驗(yàn)是JSR303的標(biāo)準(zhǔn),通過(guò)在bean的屬性上打上@NotNull、@Max等進(jìn)行驗(yàn)證。JSR303提供有很多annotation接口,而SpringMVC對(duì)于這些驗(yàn)證是使用hibernate的實(shí)現(xiàn),所以我們需要添加hibernate的一個(gè)validator包:
依賴引用
compile 'javax.validation:validation-api:2.0.0.Final' compile 'org.hibernate:hibernate-validator:6.0.0.Final'
框架已經(jīng)提供校驗(yàn)如下:
JSR提供的校驗(yàn)注解:
@Null 被注釋的元素必須為 null
@NotNull 被注釋的元素必須不為 null,不能為 null , 可以為 ""
@AssertTrue 被注釋的元素必須為 true
@AssertFalse 被注釋的元素必須為 false
@Min(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值
@Max(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值
@DecimalMin(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須大于等于指定的最小值
@DecimalMax(value) 被注釋的元素必須是一個(gè)數(shù)字,其值必須小于等于指定的最大值
@Size(max=, min=) 驗(yàn)證對(duì)象(Array,Collection,Map,String)長(zhǎng)度是否在給定的范圍之內(nèi)
@Digits (integer, fraction) 被注釋的元素必須是一個(gè)數(shù)字,其值必須在可接受的范圍內(nèi)
@Past 被注釋的元素必須是一個(gè)過(guò)去的日期
@Future 被注釋的元素必須是一個(gè)將來(lái)的日期
@Pattern(regex=,flag=) 被注釋的元素必須符合指定的正則表達(dá)式
Hibernate Validator提供的校驗(yàn)注解:
@NotBlank(message =) 只能作用在String上,不能為null,而且調(diào)用trim()后,長(zhǎng)度必須大于0
@Email 被注釋的元素必須是電子郵箱地址
@Length(min=,max=) 被注釋的字符串的大小必須在指定的范圍內(nèi)
@NotEmpty 被注釋的字符串的必須非空,不能為 null、"",可以為 " "
@Range(min=,max=,message=) 被注釋的元素必須在合適的范圍內(nèi)
實(shí)例演示
創(chuàng)建需要被校驗(yàn)的實(shí)體類:
package com.yiba.wifi.news.bean.model; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.*; public class User { @NotBlank(message = "用戶名不能為null,長(zhǎng)度必須大于0") String name; //用戶名 @Min(value = 1, message = "最小年齡為1歲") @Max(value = 120, message = "最大年齡為120歲") Integer age; //年齡 @Email(message = "郵箱格式錯(cuò)誤") @NotBlank(message = "郵箱格式錯(cuò)誤") String email; //郵箱 @Length(min = 6, max = 12, message = "密碼長(zhǎng)度必須在6位到12位之間") String pwd;//密碼 //get、set......... }
注意在校驗(yàn)郵箱的時(shí)候,當(dāng) email 為 "", 或者 null 的時(shí)候,會(huì)通過(guò) @Email驗(yàn)證,所以郵箱校驗(yàn)需要 @Email和 @NotBlank 共同起作用。
controller 接口設(shè)計(jì),在參數(shù)接受的地方添加 @Validated 關(guān)鍵字
/** * 登錄接口 * @return */ @PostMapping("login") public String login(@Validated @RequestBody User user) { return "ok"; }
訪問(wèn)測(cè)試:
當(dāng)訪問(wèn)數(shù)據(jù)是如下格式的時(shí)候
{ "name": "", "age": 0, "email": "", "pwd": "" }
響應(yīng)為:
{ "timestamp": 1524640724522, "status": 400, "error": "Bad Request", "exception": "org.springframework.web.bind.MethodArgumentNotValidException", "errors": [ { "codes": [ "NotBlank.user.email", "NotBlank.email", "NotBlank.java.lang.String", "NotBlank" ], "arguments": [ { "codes": [ "user.email", "email" ], "arguments": null, "defaultMessage": "email", "code": "email" } ], "defaultMessage": "郵箱格式錯(cuò)誤", "objectName": "user", "field": "email", "rejectedValue": "", "bindingFailure": false, "code": "NotBlank" }, { "codes": [ "NotBlank.user.name", "NotBlank.name", "NotBlank.java.lang.String", "NotBlank" ], "arguments": [ { "codes": [ "user.name", "name" ], "arguments": null, "defaultMessage": "name", "code": "name" } ], "defaultMessage": "用戶名不能為null,長(zhǎng)度必須大于0", "objectName": "user", "field": "name", "rejectedValue": "", "bindingFailure": false, "code": "NotBlank" }, { "codes": [ "Length.user.pwd", "Length.pwd", "Length.java.lang.String", "Length" ], "arguments": [ { "codes": [ "user.pwd", "pwd" ], "arguments": null, "defaultMessage": "pwd", "code": "pwd" }, 12, 6 ], "defaultMessage": "密碼長(zhǎng)度必須在6位到12位之間", "objectName": "user", "field": "pwd", "rejectedValue": "", "bindingFailure": false, "code": "Length" }, { "codes": [ "Min.user.age", "Min.age", "Min.java.lang.Integer", "Min" ], "arguments": [ { "codes": [ "user.age", "age" ], "arguments": null, "defaultMessage": "age", "code": "age" }, 1 ], "defaultMessage": "最小年齡為1歲", "objectName": "user", "field": "age", "rejectedValue": 0, "bindingFailure": false, "code": "Min" } ], "message": "Validation failed for object='user'. Error count: 4", "path": "/yiba/sms/login" }
可以看到本地請(qǐng)求,4個(gè)字段校驗(yàn)都沒通過(guò),那么我有沒有辦法獲取異常信息呢,答案是有的,需要我們修改 controller 接口。
/** * 登錄接口 * * @return */ @PostMapping("login") public String login(@Validated @RequestBody User user, BindingResult bindingResult) { if (bindingResult.hasErrors()) { //有校驗(yàn)沒通過(guò) List<ObjectError> errorList = bindingResult.getAllErrors(); for (ObjectError error : errorList) { System.out.println(error.getDefaultMessage()); //輸出具體的錯(cuò)誤信息 } return "參數(shù)異常"; } return "ok"; }
再次請(qǐng)求,請(qǐng)求格式如下
{ "name": "", "age": 0, "email": "", "pwd": "" }
響應(yīng)如下
參數(shù)異常
在控制臺(tái)打印的信息如下:
用戶名不能為null,長(zhǎng)度必須大于0
密碼長(zhǎng)度必須在6位到12位之間
最小年齡為1歲
郵箱格式錯(cuò)誤
可以看到我們已經(jīng)正常的獲取到了校驗(yàn)信息了。
下面我們來(lái)做一次參照正確的訪問(wèn):
請(qǐng)求參數(shù)如下:
{ "name": "zhaoyanjun", "age": 1, "email": "362299465@qq.com", "pwd": "123456" }
看完上述內(nèi)容,你們對(duì)使用Spring怎么實(shí)現(xiàn)請(qǐng)求參數(shù)校驗(yàn)功能有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。