beat365官网下载苹果手机-365bet备用服务器-bt365投注

记录时光的故事

javax.validation @Valid注解实现参数校验

分类: bt365投注 时间: 2025-09-18 13:29:59 作者: admin 阅读: 8771
javax.validation @Valid注解实现参数校验

在 RESTful 的接口服务中,存在各种各样的请求参数。在跳入业务处理环节之前,通常会有一个基础的数据验证的机制,待验证通过,结果无误后,请求参数才会传递到正式的业务处理中。

maven 依赖引入

Spring Boot项目中,Validation校验需要引入的两个包:

org.hibernate.validator

hibernate-validator

6.0.16.Final

compile

javax.validation

validation-api

2.0.1.Final

如何使用javax.validation @Valid注解

Hibernate-Validator的主要使用方式是在Controller的请求参数加@Valid 注解,并且是“零配置”的,无需配置也可以使用。 @Valid 注解表示需要对这个对象的属性进行验证:

public String saveUser(@RequestBody **@Valid** User user) {...}

既然是属性验证,那么就肯定会有验证结果,验证结果可以通过在请求参数那直接添加一个BindingResult变量来获取。在 User类的属性上打上如下注解:

import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotBlank;

/**

* @author Wiener

* @since 2021/11/7

*/

@Data

public class User {

@NotBlank(

message = "姓名不能为空"

)

@Length(

message = "姓名最长为 {max}个字符"

, min = 1

, max = 20

)

private String name;

@NotBlank(

message = "密码不能为空"

)

@Length(

message = "密码最少为{min}个字符,最长为 {max}个字符"

, min = 8

, max = 30

)

private String password;

/** 年龄 */

@NotNull(message = "请输入年龄")

@Range(message = "年龄大小范围为 {min} 到 {max} 之间", min = 1, max = 150)

public Integer age;

@NotBlank

@Size(max=32,message="address is null")

private String address;

/**

* 当前时间不能为空(必填)

*/

@NotBlank(message="当前时间不能为空")

@DateTimeStr(format ="yyyy-MM-dd HH:mm:ss", message = "格式错误,正确格式为:yyyy-MM-dd HH:mm:ss")

private String currentTime;

}

当输入不能满足条件时,就会抛出异常,而后统一由异常中心处理。也可以用BindingResult,但是用了这个后就必须手动处理异常,侵入了正常的业务逻辑,并不推荐。

常用注解

这儿介绍Hibernate和 javax.validation 包下的一些常用校验注解。

@Null

限制只能为null

@NotNull

限制必须不为null

@AssertFalse

限制必须为false

@AssertTrue

限制必须为true

@DecimalMax(value)

限制必须为一个不大于指定值的数字

@DecimalMin(value)

限制必须为一个不小于指定值的数字

@Digits(integer,fraction)

限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction

@Future

限制必须是一个将来的日期

@Max(value)

限制必须为一个不大于指定值的数字

@Min(value)

限制必须为一个不小于指定值的数字

@Past

限制必须是一个过去的日期

@Pattern(value)

限制必须符合指定的正则表达式

@Size(max,min)

限制字符串长度必须在min到max之间

@Past

验证注解的元素值(日期类型)比当前时间早

@NotEmpty

验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)

@NotBlank

验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格

@Email

验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

嵌套实体验证和测试用例

温馨提示:实体类验证只是针对该实体内第一层的属性进行验证,如果被验证的实体类存在另一个实体类B,那么就需要在B类成员变量上加 @valid 注解。如在Student类中添加班级CurrentTimeDto类型的成员变量并校验其属性:

import lombok.Data;

import org.hibernate.validator.constraints.Length;

import org.hibernate.validator.constraints.Range;

import javax.validation.Valid;

import javax.validation.constraints.NotNull;

import javax.validation.constraints.Pattern;

import javax.validation.constraints.Size;

import java.io.Serializable;

@Data

public class Student implements Serializable {

private static final long serialVersionUID = 5285725868010678653L;

@NotNull(

message = "姓名不能为空"

)

@Length(

message = "姓名最长为 {max}个字符"

, min = 1

, max = 20

)

private String name;

@NotNull(

message = "密码不能为空"

)

@Length(

message = "密码最少为{min}个字符,最长为 {max}个字符"

, min = 8

, max = 30

)

private String password;

/** 年龄 */

@NotNull(message = "请输入年龄")

@Range(message = "年龄大小范围为 {min} 到 {max} 之间", min = 1, max = 150)

public Integer age;

@NotNull(message = "请输入address")

@Size(max=32,message="address is null")

private String address;

@Pattern(regexp = "\\d{3}-\\d{8}|\\d{4}-\\d{7}|\\d{11}", message = "手机号码不正确")

private String telephone;

@Valid

private CurrentTimeDto currentTimeDto;

}

import lombok.Data;

import javax.validation.constraints.NotBlank;

import java.io.Serializable;

@Data

public class CurrentTimeDto implements Serializable {

private static final long serialVersionUID = -7831097421296635187L;

/**

* 当前时间不能为空(必填)

*/

//设置时区为上海时区,时间格式自己据需求定。

// @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")

@NotBlank(message="当前时间不能为空")

private String currentTime;

}

下面是两个基于Student类的测试用例,在请求参数前加上 @Valid注解即开启参数校验:

/**

* 参数校验结果从bindingResult中读取

* @param student

* @param bindingResult

* @return

*/

@ApiOperation(value = "bindingResult")

@PostMapping("/bindingResult")

public Object bindingResult(@RequestBody @Valid Student student, BindingResult bindingResult) {

System.out.println("bindingResult---" + student);

if (bindingResult.getErrorCount() > 0) {

return bindingResult.getFieldError();

}

return student;

}

/**

* 参数校验结果仅仅可以从日志中查看

* @param student

* @return

*/

@ApiOperation(value = "validParam")

@PostMapping("/validParam")

public Object validParam(@RequestBody @Valid Student student) {

System.out.println("validParam---" + student);

return student;

}

小结

愿各位新时代农民工不断打破自己,提升自己,重塑自己,从而让自己的职业和生活更加璀璨。

相关文章

交警提醒:2024年C驾照6大调整,涉及每位车主!不懂的要吃亏!
蚊子几乎不叮人脸竟是因为“厚脸皮”
《魔兽世界怀旧服》挂机掉线机制详解 挂机多久会掉线
苹果 iPhone 7 128GB 玫瑰金色 A1660屏幕反应灵敏 苏宁橙子云官方旗舰店仅售5388元 (有返券)
关于壁的成语有哪些成语(壁的成语有哪些成语大全)(40个)
如何在PPT中画图?绘图工具怎么用?