SpringBoot 使用validator进行参数校验(实例操作+注意事项+自定义参数校验)

这篇具有很好参考价值的文章主要介绍了SpringBoot 使用validator进行参数校验(实例操作+注意事项+自定义参数校验)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实例操作

①、引入依赖

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.0.4.Final</version>
        </dependency>

②、创建实体类

package com.springboot.entity;

import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = -7362371894429216969L;

    @NotEmpty(message="用户名不能为空")
    @Length(min=6,max = 12,message="用户名长度必须位于6到12之间")
    private String userName;


    @NotEmpty(message="密码不能为空")
    @Length(min=6,message="密码长度不能小于6位")
    private String passWord;

    @Email(message="邮箱格式错误")
    private String email;

    @Pattern(regexp = "^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message = "身份证格式错误")
    private String idCard;

    @Pattern(regexp = "^((13[0-9]{1})|159|153)+\\d{8}$",message = "手机号格式错误")
    private String phone;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public User(@NotEmpty(message = "用户名不能为空") @Length(min = 6, max = 12, message = "用户名长度必须位于6到12之间") String userName, @NotEmpty(message = "密码不能为空") @Length(min = 6, message = "密码长度不能小于6位") String passWord, @Email(message = "请输入正确的邮箱") String email, @Pattern(regexp = "^(\\d{18,18}|\\d{15,15}|(\\d{17,17}[x|X]))$", message = "身份证格式错误") String idCard, @Pattern(regexp = "^((13[0-9]{1})|159|153)+\\d{8}$", message = "手机号格式错误") String phone) {
        this.userName = userName;
        this.passWord = passWord;
        this.email = email;
        this.idCard = idCard;
        this.phone = phone;
    }

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", passWord='" + passWord + '\'' +
                ", email='" + email + '\'' +
                ", idCard='" + idCard + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}

③、建立控制层

package com.springboot.controller;

import com.springboot.entity.User;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.util.List;

@RestController
public class TestController {
    @PostMapping("/test")
    public String testDemo(@Valid User user, BindingResult bindingResult){
        System.out.println(user.toString());
        StringBuffer stringBuffer = new StringBuffer();
        if(bindingResult.hasErrors()){
            List<ObjectError> list =bindingResult.getAllErrors();
            for (ObjectError objectError:list) {
                stringBuffer.append(objectError.getDefaultMessage());
                stringBuffer.append("---");
            }
        }
        return stringBuffer!= null ?stringBuffer.toString():"";
    }
}

④、进行测试

作为测试demo,到这里就可以直接测试了

SpringBoot 使用validator进行参数校验(实例操作+注意事项+自定义参数校验)

二、注意事项

①、@NotNull ,@NotEmpty 和 @NotBlank 三者的区别

@NotNull、@NotEmpty 和 @NotBlank 都是用于Java中进行参数校验的注解,它们之间的区别如下:

  1. @NotNull 注解用于限制参数不能为null。

  2. @NotEmpty 注解用于限制字符串、集合、Map等不能为null且大小必须大于0。

  3. @NotBlank 注解用于限制字符串不能为null并且去除两端空格后长度必须大于0。

可以简单理解为:

  • @NotNull 是用来限制对象或元素不能为null;
  • @NotEmpty 是用来限制字符串、集合、Map等不能为空;
  • @NotBlank 是用来限制字符串不能为空且长度必须大于0。

需要注意的是,这三个注解都只能用于校验方法参数,不能用于校验类属性。同时,它们都属于Hibernate Validator提供的校验注解,如果要使用这些注解,需要引入Hibernate Validator的相关依赖。

②、引入依赖的版本

要看清楚,用那种方法,具体导入什么依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

三、自定义参数校验

        这种情况主要是应对有一些特殊场景,没有相应的注解进行校验,当然,在service层中去写相应的逻辑也行,这里算是提供另一个思路和方法(说白了就是写一个自定义注解,在自定义注解中写上相应的要判断的逻辑)

①、项目结构

SpringBoot 使用validator进行参数校验(实例操作+注意事项+自定义参数校验)文章来源地址https://www.toymoban.com/news/detail-472112.html

 ②、编写自定义注解

import com.example.demo.MyConstraint;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;


public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {
    //String为校验的类型
    @Override
    public void initialize(MyConstraint myConstraint) {
        //启动时执行
    }

    /**
     * @Description: 自定义校验逻辑
     */
    @Override
    public boolean isValid(String s, ConstraintValidatorContext validatorContext) {
        if (!(s.equals("北京") || s.equals("上海"))) {
            return false;
        }

        return true;
    }
}
import com.example.MyConstraintValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


//用于指定使用范围,该处限定只能在字段上使用
@Target({ElementType.FIELD})
//表示注解在运行时可以通过反射获取到
@Retention(RetentionPolicy.RUNTIME)
//@Constraint注解,里面传入了一个validatedBy的字段,指定该注解校验逻辑
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {
    /**
     * @Description: 错误提示
     */
    String message() default "请输入中国政治或者经济中心的城市名";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

③、对应的实体类

import com.example.demo.MyConstraint;
import lombok.Data;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.*;
import java.io.Serializable;

@Data
public class User implements Serializable {
    /**
     * 主键ID
     */
    private Long id;

    @NotBlank(message = "用户名不能为空")
    @Length(min = 5, max = 20, message = "用户名长度为5-20个字符")
    private String name;

    @NotNull(message = "年龄不能为空")
    @Min(value = 18 ,message = "最小18岁")
    @Max(value = 60,message = "最大60岁")
    private Integer age;

/*    @NotBlank(message = "电话不可以为空")
    @Length(min = 1, max = 13, message = "电话长度需要在13个字符以内")
    private String phone;*/

    @Email(message = "请输入邮箱")
    @NotBlank(message = "邮箱不能为空")
    private String email;

   /* @NotNull(message = "必须指定用户状态")
    @Min(value = 0, message = "用户状态不合法")
    @Max(value = 1, message = "用户状态不合法")
    private Integer status;*/

    @MyConstraint
    private String answer;

}

④、控制层

import com.example.demo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import javax.validation.Valid;

@Controller
public class TestValidator {

    @GetMapping("/test")
    public String showForm(User user) {
        return "form";
    }

    @GetMapping("/results")
    public String results() {
        return "results";
    }

    @PostMapping("/test")
    public String checkUser(@Valid User user, BindingResult bindingResult, RedirectAttributes attr) {
        //特别注意实体中的属性必须都验证过了,不然不会成功
        if (bindingResult.hasErrors()) {
            return "form";
        }
        /**
         * @Description:
         * 1.使用RedirectAttributes的addAttribute方法传递参数会跟随在URL后面 ,如上代码即为?name=long&age=45
         * 2.使用addFlashAttribute不会跟随在URL后面,会把该参数值暂时保存于session,待重定向url获取该参数后从session中移除,
         * 这里的redirect必须是方法映射路径。你会发现redirect后的值只会出现一次,刷新后不会出现了,对于重复提交可以使用此来完成。
         */
        attr.addFlashAttribute("user", user);
        return "redirect:/results";

    }
}

到了这里,关于SpringBoot 使用validator进行参数校验(实例操作+注意事项+自定义参数校验)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spring Boot 使用validation校验参数

    在看公司代码的时候,发现是用了 Spring Boot Validation 去检验参数的,但是后面又在代码里去检验参数去了,而且这个 Spring Boot Validation 校验好像并不生效。于是自己摸索研究了一下。 虽然项目使用的校验都是 javax.validation ,但是不引入这个依赖他是真的不生效。 gradle如下:

    2024年01月25日
    浏览(14)
  • 化繁为简,使用Hibernate Validator实现参数校验

    化繁为简,使用Hibernate Validator实现参数校验

    目录 前言 环境配置 导入依赖 基础校验 校验注解 参数绑定 @PathVariable @RequestParam @RequestBody @Validated @Valid 单参校验 对象校验 分组校验 顺序校验         在之前的悦享校园的开发中使用了SSM框架,由于当时并没有使用参数参数校验工具,方法的入参判断使用了大量的if else语

    2024年02月12日
    浏览(16)
  • java使用Validation进行数据校验

    在开发中,我们经常遇到参数校验的需求,比如用户注册的时候,要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式,我们会把校验的代码和真正的业务处理逻辑耦合在一起,而且如果未来要新增一种校验逻辑也需要在

    2024年02月06日
    浏览(11)
  • java如何优雅的实现参数非空校验,快速实现参数非空校验,使用@valid实现参数非空校验

    在java项目接口中,有些必传参数需要进行非空校验,如果参数过多,代码会繁杂且冗余,如何优雅的对参数进行非空校验,下面是实现流程 用实体类接收参数,使用非空注解编辑参数内容 使用 @Valid 注解对参数进行拦截,整体进行非空校验 如果是SpringBoot项目,引入web开发包

    2024年02月08日
    浏览(15)
  • spring-boot 请求参数校验:注解 @Validated 的使用、手动校验、自定义校验

    spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。 spring-boot已经引入了基础包,所以直接使用就可以。 在属性上添加校验注解: 在Controller上添加 @Validated 注解 校验未通过时,可能看到: 在 @Validated 后面紧跟着追加BindingResult,

    2023年04月16日
    浏览(19)
  • 【优雅的参数验证@Validated】@Validated参数校验的使用及注解详解——你还在用if做条件验证?

    【优雅的参数验证@Validated】@Validated参数校验的使用及注解详解——你还在用if做条件验证?

    请先看看下面代码:(简单举个例子,代码并不规范) 以上代码主要是为了对用户user实体进行条件验证。 但是那么多的if, 写得纯纯得小白一个,也使得代码显得臃肿不美观不优雅! 接下来,让我们学习使用优雅的参数验证@Validated! @Valid和@Validated是Spring Validation框架提供

    2024年02月02日
    浏览(18)
  • Spring Boot使用 Hibernate-Validator校验参数时的长度校验

    今天在使用Validator框架数据验证的时候碰到了三个类似的注解,都是用来限制长度,但是用法上有区别:  @Size是一个Bean验证注释,用于验证关联的String具有的长度受最小值和最大值限制的值.  @Length是一个Hibernate特定的注释,与@Size具有相同的含义; 两者的区别: ​ 用@length限

    2024年02月14日
    浏览(13)
  • springboot使用@Valid 和 @Validated 注解校验详解以及编写一个自定义全局异常类

    springboot使用@Valid 和 @Validated 注解校验详解以及编写一个自定义全局异常类

    全局异常处理类 验证: ============================================== 导入所需要的包: 如果你是 springboot 项目,那么可以不用引入了,已经引入了,他就存在于最核心的 web 开发包里面。 如果你不是 springboot 项目,那么引入下面依赖即可: 新建三个实体类 实现一: 使用@Valid注解修

    2024年02月10日
    浏览(20)
  • @Valid、@Validated参数校验详解

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M6CfNsNC-1687851467867)(images/20200913110853722.png)] 说明:若不做异常处理,@Validated注解的默认异常消息如下(示例): 因此我们在这里做了一个全局的异常处理类,用于处理参数校验失败后抛出的异常,同

    2024年02月11日
    浏览(15)
  • spring参数校验@Validated及嵌套校验

    本文介绍项目中校验 @Validated的使用,主要分参数对象属性校验,嵌套校验,集合在对象属性中校验,集合作为参数校验。 controller层 测试输入 输出 这里作为参数,如果使用List接收是不起作用的,必须用ValidList,这个类中有标记 @Valid @Valid private ListE list = new ArrayList(); 如果在

    2024年02月09日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包