Spring請(qǐng)求參數(shù)校驗(yàn)功能實(shí)例演示
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)都沒(méi)通過(guò),那么我有沒(méi)有辦法獲取異常信息呢,答案是有的,需要我們修改 controller 接口。
/**
* 登錄接口
*
* @return
*/
@PostMapping("login")
public String login(@Validated @RequestBody User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
//有校驗(yàn)沒(méi)通過(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"
}
響應(yīng)如下:
ok
控制臺(tái)什么也沒(méi)輸出。
總結(jié)
以上所述是小編給大家介紹的Spring請(qǐng)求參數(shù)校驗(yàn)功能實(shí)例演示,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
一文教你掌握J(rèn)ava如何實(shí)現(xiàn)判空
實(shí)際項(xiàng)目中我們會(huì)有很多地方需要判空校驗(yàn),如果不做判空校驗(yàn)則可能產(chǎn)生NullPointerException異常。所以本文小編為大家整理了Java中幾個(gè)常見(jiàn)的判空方法,希望對(duì)大家有所幫助2023-04-04
Springboot Maven打包跳過(guò)測(cè)試的五種方式小結(jié)
本文主要介紹了Springboot Maven打包跳過(guò)測(cè)試的五種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
如何基于Idea遠(yuǎn)程調(diào)試tomcat war包及jar包
這篇文章主要介紹了如何基于Idea遠(yuǎn)程調(diào)試tomcat war包及jar包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
SpringBoot項(xiàng)目如何訪問(wèn)jsp頁(yè)面的示例代碼
本篇文章主要介紹了SpringBoot項(xiàng)目如何訪問(wèn)jsp頁(yè)面的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10
Java操作redis設(shè)置第二天凌晨過(guò)期的解決方案
這篇文章主要介紹了Java操作redis設(shè)置第二天凌晨過(guò)期的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
springboot項(xiàng)目打docker鏡像實(shí)例(入門級(jí))
最近做個(gè)項(xiàng)目,我們想把自己的程序打包成鏡像,并運(yùn)行在docker容器中,本文主要介紹了springboot項(xiàng)目打docker鏡像實(shí)例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
利用Redis實(shí)現(xiàn)延時(shí)處理的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于利用Redis實(shí)現(xiàn)延時(shí)處理的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
java導(dǎo)出excel 瀏覽器直接下載或者或以文件形式導(dǎo)出
這篇文章主要介紹了java導(dǎo)出excel 瀏覽器直接下載或者或以文件形式導(dǎo)出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

