RESTful接口中如何使用注解进行参数验证呢?

乔欣 Java经验 发布时间:2023-02-21 16:55:46 阅读数:17359 1
下文笔者讲述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;
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202302/16769704975866.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者