RESTful接口中如何使用注解进行参数验证呢?
下文笔者讲述RESTful接口中注解进行参数验证的方法及示例分享
注解验证的实现思路
1.引入相应的jar包 2.定义实体类时,进行相应的注解设置 3.使用@Valid注解,即可实现参数校验例:SpringBoot参数校验的示例
jar包引入
maven 依赖引入 Spring Boot项目中,Validation校验需要引入的两个包: <dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.16.Final</version> <scope>compile</scope> </dependency> <dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency>
Controller编写
public String saveUser(@RequestBody **@Valid** User user) {...}
实体定义
import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotBlank; @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; }
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格式
实体类定义
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; }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。