当前位置: 首页 > news >正文

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() {}@Overridepublic 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,到这里就可以直接测试了

二、注意事项

①、@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层中去写相应的逻辑也行,这里算是提供另一个思路和方法(说白了就是写一个自定义注解,在自定义注解中写上相应的要判断的逻辑)

①、项目结构

 ②、编写自定义注解

import com.example.demo.MyConstraint;import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class MyConstraintValidator implements ConstraintValidator<MyConstraint, String> {//String为校验的类型@Overridepublic void initialize(MyConstraint myConstraint) {//启动时执行}/*** @Description: 自定义校验逻辑*/@Overridepublic 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;*/@MyConstraintprivate 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";}
}

http://www.lryc.cn/news/92127.html

相关文章:

  • 字节测开岗面试记:二面被血虐,幸好还是拿到了Offer.....
  • 只会标准答案,是不可救药的愚蠢
  • RocketMQ broker启动失败
  • 浅谈useMemo函数
  • 【Python】Python系列教程-- Python3 推导式(十九)
  • docker对cpu资源做限制
  • 国际化语言项目
  • 交直流系统潮流计算及相互关联特性分析(Matlab代码实现)
  • 如何快速掌握Facebook运营+独立站运营基础?
  • Java之旅(十三)
  • Calibre 6.18.1 正式发布,功能强大的开源电子书工具
  • 如何在C语言中定义和使用函数?
  • 【C++】4.多媒体库:SFML库入门
  • 【算法题】1717. 删除子字符串的最大得分
  • Codeforces Round 877 (Div. 2) ABCD
  • easyExcel导入失败提示用户第几行有误并回滚数据
  • 问道价值互联网,区块链的下一个十年 | 2023 开放原子全球开源峰会区块链分论坛即将启幕
  • 解读 Nginx 配置
  • 知识变现海哥:课程定价容易出现的三大误区
  • Android开发 LogDog (日志狗)V2.0.0
  • JavaScript break
  • linux服务器使用curl命令处理常用es查询
  • Office Visio 2013安装
  • C++ 私有析构函数的作用
  • 【C++】deque的用法
  • Live800:智能客服有哪些未来发展趋势?
  • 【一】Java SE 基础
  • Linux防火墙学习笔记2
  • Linux下MongDB定时备份方案
  • 长尾词挖掘,长尾词的优化方法有哪些