Spring请求参数校验功能实例演示
作者:赵彦军 发布时间:2023-04-26 02:05:53
SpringMVC支持的数据校验是JSR303的标准,通过在bean的属性上打上@NotNull、@Max等进行验证。JSR303提供有很多annotation接口,而SpringMVC对于这些验证是使用hibernate的实现,所以我们需要添加hibernate的一个validator包:
依赖引用
compile 'javax.validation:validation-api:2.0.0.Final'
compile 'org.hibernate:hibernate-validator:6.0.0.Final'
框架已经提供校验如下:
JSR提供的校验注解:
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null,不能为 null , 可以为 ""
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
Hibernate Validator提供的校验注解:
@NotBlank(message =) 只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空,不能为 null、"",可以为 " "
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
实例演示
创建需要被校验的实体类:
package com.yiba.wifi.news.bean.model;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.*;
public class User {
@NotBlank(message = "用户名不能为null,长度必须大于0")
String name; //用户名
@Min(value = 1, message = "最小年龄为1岁")
@Max(value = 120, message = "最大年龄为120岁")
Integer age; //年龄
@Email(message = "邮箱格式错误")
@NotBlank(message = "邮箱格式错误")
String email; //邮箱
@Length(min = 6, max = 12, message = "密码长度必须在6位到12位之间")
String pwd;//密码
//get、set.........
}
注意在校验邮箱的时候,当 email 为 "", 或者 null 的时候,会通过 @Email验证,所以邮箱校验需要 @Email和 @NotBlank 共同起作用。
controller 接口设计,在参数接受的地方添加 @Validated 关键字
/**
* 登录接口
* @return
*/
@PostMapping("login")
public String login(@Validated @RequestBody User user) {
return "ok";
}
访问测试:
当访问数据是如下格式的时候
{
"name": "",
"age": 0,
"email": "",
"pwd": ""
}
响应为:
{
"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": "邮箱格式错误",
"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,长度必须大于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": "密码长度必须在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"
}
可以看到本地请求,4个字段校验都没通过,那么我有没有办法获取异常信息呢,答案是有的,需要我们修改 controller 接口。
/**
* 登录接口
*
* @return
*/
@PostMapping("login")
public String login(@Validated @RequestBody User user, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
//有校验没通过
List<ObjectError> errorList = bindingResult.getAllErrors();
for (ObjectError error : errorList) {
System.out.println(error.getDefaultMessage()); //输出具体的错误信息
}
return "参数异常";
}
return "ok";
}
再次请求,请求格式如下
{
"name": "",
"age": 0,
"email": "",
"pwd": ""
}
响应如下
参数异常
在控制台打印的信息如下:
用户名不能为null,长度必须大于0
密码长度必须在6位到12位之间
最小年龄为1岁
邮箱格式错误
可以看到我们已经正常的获取到了校验信息了。
下面我们来做一次参照正确的访问:
请求参数如下:
{
"name": "zhaoyanjun",
"age": 1,
"email": "362299465@qq.com",
"pwd": "123456"
}
响应如下:
ok
控制台什么也没输出。
总结
以上所述是小编给大家介绍的Spring请求参数校验功能实例演示网站的支持!
来源:https://www.cnblogs.com/zhaoyanjun/p/9007056.html


猜你喜欢
- 专栏介绍本系列专栏会以虹猫蓝兔七侠传的故事为例来给大家详细分析所有模式,希望能给大家带来帮助!本期介绍模式: 简单工厂模式案例: 一个天外陨
- 找入口对 Spring 有一定基础的同学一定知道,请求入口是DispatcherServlet,所有的请求最终都会落到doDispatch方
- 本文实例讲述了C#使用有道ip地址查询接口方法。分享给大家供大家参考。具体实现方法如下:#region 读取http://www.yodao
- 我正在开发一个软键盘,做得很好,但是我不知道如何自定义一个长按键的弹出窗口.我的键盘视图:<?xml version="1.
- C#抓图服务首先抽象出抓图接口,然后对接口做基于公共操作的抽象类封装,之后针对不同的抓图方式做差异化处理,最后根据接口实现抓图服务。注意:W
- 1. SpringBoot ResponseBody 返回值中null值处理@PostMapping(path = "/test&
- 本文实例讲述了C#操作session的类。分享给大家供大家参考。具体分析如下:这个C#类对session操作进行了再次封装,可以大大简化se
- 静态变量静态变量位于栈上,它是一个全局变量,在编译期就已经生成。public class Cow{public static int cou
- 最近做项目,需要设置用户的生日,所以做这样一个功能。开始发觉自带的DatePicker 很是不好用。上代码:<DatePicker &
- 实现目标通过C#实现电脑的注销、关机、重启功能知识点本案例涉及的知识点包含:Process、Shell32.dll、User32.dll、S
- 本文实例为大家分享了java实现双人五子棋游戏的具体代码,供大家参考,具体内容如下通过 上下左右 控制棋盘走动 空格落子 &nb
- 一、Nuget安装log4net --> Install-Package log4net二、在AssemblyInfo.cs文件中添加
- Lambda 表达式最早接触到 Lambda 表达式的时候,是在学习 python 的时候,当时就很好奇。后来,才发现 Java 也有这个方
- 一直以来做对外的接口文档都比较原始,基本上都是手写的文档传来传去,最近发现了一个新玩具,可以在接口上省去不少麻烦。swagger是一款方便展
- 今天没事跟群里面侃大山,有个哥们说道Android Wheel这个控件,以为是Andriod内置的控件,google一把,发现是个githu
- 一、对Canvas进行操作对Canvas的一系列操作,是指对Canvas进行旋转、平移、缩放等操作。这些操作可以让Canvas对象使用起来更
- 本文主要从两个方面对Android Volley框架的使用方法进行讲解,具体内容如下一、网络请求1.get方式请求数据// 1 创建一个请求
- 介绍非常简单的一个计时器,没有太多原理,我们直接上代码。先看课程目标课程目标就是一个简单的计时器,我们直接上使用示例吧界面里有一个计时器,4
- 在idea中安装完ActivateJrebel以后,运行时弹出激活页面,输入团队地址: http://jrebel.whrj999.com/
- 每个使用Android手机的人应该对Android中的通知不陌生,下面我们就学习一下怎么使用Android中的通知。一、通知的基本用法活动、