Python 官方文档:入门教程 => 点击学习
目录1.为什么后端要进行数据校验?2.怎么使用数据校验?(要添加对应依赖)(1)在实体上的属性上添加校验注解:(2)在controller层的方法前加上注解@Validated开启数
如果新增一个数据,直接在前端页面新增,由于前端代码中有设置数据不能为空,所以不会传入空值。但是不通过前端页面新增一个数据时,比如使用swagger,直接访问后端时,当某个值为空时,可能会被传进数据库,这就会造成一些问题。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>2.3.2.RELEASE</version>
</dependency>
实体类上:
每个分组都要创建一个对应的接口:
controller层开启分组校验:
@Validated注解里面支持多个分组。
@Valid注解不支持分组校验
import com.seckill.validator.IsMobileValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
validatedBy = {IsMobileValidator.class}
)
public @interface IsMobile {
// 默认为true
boolean required() default true;
String message() default "手机号码格式错误";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
import org.thymeleaf.util.StringUtils;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PhoneNumberValidator {
// 正则表达式
private static final Pattern mobile_pattern=Pattern.compile("^1(3[0-9]|5[0-3,5-9]|7[0-3,5-8]|8[0-9])\\d{8}$");
public static boolean isMobile(String mobile){
if(StringUtils.isEmpty(mobile)){
return false;
}
Matcher matcher = mobile_pattern.matcher(mobile);
return matcher.matches();
}
}
import com.seckill.annotations.IsMobile;
import com.seckill.utils.PhoneNumberValidator;
import org.thymeleaf.util.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class IsMobileValidator implements ConstraintValidator<IsMobile,String> {
private boolean required=false;
@Override
public void initialize(IsMobile constraintAnnotation) {
//先获取到填的值 true/false
required=constraintAnnotation.required();
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
// 判断是否为必填
if(required){ //必填
return PhoneNumberValidator.isMobile(s);
}else { //非必填
if(StringUtils.isEmpty(s)){ //非必填时填的值为空时
return true;
}else{ //非必填时填的值不为空时
return PhoneNumberValidator.isMobile(s);
}
}
}
}
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseBean ExceptionHandler(Exception e){
if(e instanceof GlobalException){
GlobalException ex= (GlobalException) e;
return ResponseBean.error(ex.getResponseBeanEnum());
// 处理参数校验抛出的异常 BindException
}else if(e instanceof BindException){
BindException ex= (BindException) e;
ResponseBean res=ResponseBean.error(ResponseBeanEnum.BINDING_ERROR);
res.setMessage("参数校验异常:"+ex.getAllErrors().get(0).getDefaultMessage());
return res;
}
return ResponseBean.error(ResponseBeanEnum.ERROR);
}
}
在属性上使用这个注解:
@IsMobile(message = "联系电话格式不正确")
@NotNull(message = "手机号不能为空")
@excel(name = "选手联系电话")
private String phoneNumber;
然后在Controller类上或者方法传入的参数前加@Validated或@Valid注解来开启参数校验。
controller层:
加上@Validated
@PostMapping
public ajaxResult addInfo(@RequestBody @Validated TeamInfoDto teamInfoDto)
{
return toAjax(comTeamService.insert(teamInfoDto));
}
实体类中:
在要校验的集合属性上加@Valid这个注解,否则它只会校验这个集合中元素是否为空,不会校验集合中各个元素
@Data
public class TeamInfoDto {
@NotEmpty(message = "选手信息不能为空")
@Valid
private List<ComUser> user;
}
对集合中元素数据的限制设置:
在ComUser实体类中:
在想要校验的属性上加上对应注解
public class ComUser extends BaseEntity
{
private static final long serialVersionUID = 1L;
private Long id;
@NotNull(message = "姓名不能为空")
private String name;
@NotNull(message = "手机号不能为空")
@IsMobile(message = "手机格式不正确")
private String phoneNumber;
@NotEmpty(message = "邮箱不能为空")
private String email;
}
到此这篇关于SpringBoot后端数据校验的文章就介绍到这了,更多相关SpringBoot后端数据校验内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: SpringBoot后端数据校验实战操作指南
本文链接: https://lsjlt.com/news/153639.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0