spring注解校验
spring注解校验
在使用springboot 进行快速开发的时候,参数传递的地方都少不了参数校验。在web开发中,前后端都要进行参数校验,前端的参数校验是为了用户体验,后端的参数校验是为了安全.使用注解验证比较方便.
常用的校验注解:
@AssertFalse 所注解的元素必须是Boolean类型,且值为false
@AssertTrue 所注解的元素必须是Boolean类型,且值为true
@DecimalMax 所注解的元素必须是数字,且值小于等于给定的值
@DecimalMin 所注解的元素必须是数字,且值大于等于给定的值
@Digits 所注解的元素必须是数字,且值必须是指定的位数
@Future 所注解的元素必须是将来某个日期
@Max 所注解的元素必须是数字,且值小于等于给定的值 x>=value
@Min 所注解的元素必须是数字,且值小于等于给定的值
@Range 所注解的元素需在指定范围区间内
@NotNull 所注解的元素值不能为null
@NotBlank 所注解的元素值有内容
@Null 所注解的元素值为null
@Past 所注解的元素必须是某个过去的日期
@PastOrPresent 所注解的元素必须是过去某个或现在日期
@Pattern 所注解的元素必须满足给定的正则表达式
@Size 所注解的元素必须是String、集合或数组,且长度大小需保证在给定范围之内
@Email 所注解的元素需满足Email格式
使用类型:
单个方法进行校验:
get 请求只是传几个数据。就可以像上面这样直接在controller方法的参数中进行校验
@RestController
@Validated
public class PingController {@GetMapping("/getUser")
public String getUserStr(@NotNull(message = “name 不能为空”) String name,
@Max(value = 99, message = “不能大于99岁”) Integer age) {
return “name: " + name + " ,age:” + age;
}
}
post,put 请求时参数比较多,可以建立一个实体类进行
1.校验分组:
https://blog.csdn.net/pcbhyy/article/details/83920657
1.建立分组接口:
public interface UserLoginGroup {
}
public interface UserRegistGroup {
}
在实体类的数据分组校验:
public class User {
private Integer id;@NotBlank(message=“用户名不能为空”,groups= {UserLoginGroup.class,UserRegistGroup.class})
private String username;@NotNull(message=“密码不能为空”,groups= {UserLoginGroup.class,UserRegistGroup.class})
@Pattern(regexp="^\d{3,}$",message=“密码最少为3位”,groups= {UserLoginGroup.class,UserRegistGroup.class})
private String password;@DateTimeFormat(pattern=“yyyy-MM-dd”)
@Past(message=“日期必须为过去的日期”,groups= {UserRegistGroup.class})
@NotNull(message=“生日不能为空”,groups= {UserRegistGroup.class})
private Date birthday;private Integer age;
}
3.在接口中使用分类的接口:
分别在login和regis方法中添加分组校验
在controller方法中使用指定分组的校验
i)在@Validated中添加value={ValidGroup1.class}表示该方法使用了ValidGroup1分组校验规则
ii)可以指定多个分组,中间用逗号分隔用 @Validated(value= {UserLoginGroup.class}使用分组校验好的数据。
@RequestMapping(“login”)
public String login(@Validated(value= {UserLoginGroup.class}) User user,BindingResult result,Model model) {
if(result.hasErrors()) {
model.addAttribute(“errors”, result.getFieldErrors());
return “forward:/login.jsp”;
}
}
@RequestMapping(“regist”)
public String regist(@Validated(value= {UserRegistGroup.class}) User user,BindingResult result,Model model) {
if(result.hasErrors()) {
model.addAttribute(“errors”, result.getFieldErrors());
return “forward:/login.jsp”;
}
return “”;
}
2.自定义注解:
应用场景:
现在业务要求,前端要传来身份证号码,进行校验,用的比较多,每次写校验逻辑比较复杂。
决定使用spring的注解校验。
解决方法:
/*
*使用的是hutool校验身份证号的逻辑
*/
定义注解类
package com.ruoyi.common.utils.annotation;
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.constraints.NotNull;
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {IsIdCardValidator.class})
public @interface IsIdCard {
String message() default “请输入有效的身份证件号!”;
Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {NotNull[] value();
}
}
2.校验方法类
package com.ruoyi.common.utils.annotation;
import cn.hutool.core.util.IdcardUtil;
import com.ruoyi.common.utils.IdUtils;
import lombok.extern.slf4j.Slf4j;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
@Slf4j
public class IsIdCardValidator implements ConstraintValidator<IsIdCard,String> {
//初始化方法
@Override
public void initialize(IsIdCard constraintAnnotation) {
log.info(“开始校验身份证号码了”);
System.out.println(“开始校验身份证号码了”);
}
//自定义校验逻辑
@Override
public boolean isValid(String idCard, ConstraintValidatorContext constraintValidatorContext) {log.info("开始进行判断!!!");System.out.println("开始进行判断!!!");if(IdcardUtil.isValidCard(idCard)){return true;}return false;
}
}
3。开始使用:
1。定义注解校验分组:
package com.ruoyi.project.lxqz.contract.annotion;
public interface AddHu {
}
2.实体类使用注解:
/**
* 身份证号
*/
@NotNull
@Excel(name = “身份证号”)
@IsIdCard(message = “idCards is not Illegal”,groups= {AddHu.class})
private String sfzh;
- 接口中开启校验
public AjaxResult add(@RequestBody @Validated(value = {AddHu.class}) LxqzHu lxqzHu) {
…
}
结束语:现在通过做笔记,我才真正的学到了知识。
本次遇到的难点。校验一直不生效,是因为 我在接口中没添加 @Validated 导致一直校验不生效。
这是个惨痛的教训。一定要老记着这个教训。
spring注解校验相关推荐
- spring多参java注解_spring参数注解校验
在写一些controller协议的时候,有些时候从前端传过来的参数较多,好的办法是定义一个实体类来封装请求参数,但是用实体类封装参数后,无法对参数值进行校验,可以使用spring的@Validated ...
- java spring框架 注解_史上最全的java spring注解
史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...
- Spring Validation 校验
一.概述 在 Web 应用中,客户端提交数据之前都会进行数据的校验,比如用户注册时填写的邮箱地址是否符合规范.用户名长度的限制等等,不过这并不意味着服务端的代码可以免去数据验证的工作,用户也可能使用 ...
- Spring注解之@validated的使用
Spring注解之@validated的使用 spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理. 比如,我们判断一个输入参数是否合法,可 ...
- @async注解_史上最全的java spring注解
史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...
- Spring注解编程基石(四)
目录 AnnotationsScanner 扫描方法 扫描source为Class方法 扫描source为Method方法 辅助方法 MergedAnnotationSelector MergedAn ...
- @transactional注解_为啥同一个类中普通方法调用Spring注解方法,注解会失效?看完你就明白,So easy!...
Spring注解(如@Transactional.@Cacheable.@Async等),在使用不当时,很可能会失效.失效的情况有很多种,本文我们就来瞅瞅,为啥同一个类中普通方法调用Spring注解方 ...
- 浅谈Spring注解
Spring目前的趋势是使用注解结合Java代码而不是配置来定义行为.属性.功能.规则和扩展点,因此梳理注解也是梳理Spring功能点的很好的方式,全面的梳理可以补足我们知识点的漏洞. 查找所有注解 ...
- java spring注解维护,从一次工程启动失败谈谈 spring 注解
原标题:从一次工程启动失败谈谈 spring 注解 檀宝权 Java 后端开发工程师,负责度假 App 后端和广告后端开发维护工作,熟悉 Tomcat,Spring,Mybatis,会点 Python ...
最新文章
- 程序员因中年危机从北京回老家事业单位:工资从60万爆降到6万
- 13.4 常见的时期类和Math类
- element ui 表格中的字太长,想要把多余的字变成...解决方法,一个属性即可
- ABAP通过正则表达式提成字符串中的数字例子
- Winform中使用ZedGraph实现曲线图中字体去掉边框
- P1101 单词方阵(DFS)
- MQTT的学习之Mosquitto安装使用(1)
- Linux下apache与tomcat完美整合笔记
- Spring : Spring @Transactional-嵌套事物回滚
- Introducing DataFrames in Apache Spark for Large Scale Data Science(中英双语)
- Win7下如何破解Visual Studio2008 90天试用版
- tf.image.resize_images
- C语言蒙特卡洛,蒙特卡洛(Monte Carlo)模拟法 一 ( EXCEL 举例)
- 《电脑音乐制作实战指南:伴奏、录歌、MTV全攻略》——第1篇 获取伴奏篇 第1章 MIDI音乐伴奏的获取与制作 1.1 电脑MIDI音乐与设备的介绍...
- android 网络邻居,魅族Flyme系统中怎么设置网络邻居?
- php api 实例maccms,api.php · do do/maccms10 - Gitee.com
- R语言ROC曲线下的面积 - 评估逻辑回归中的歧视
- C# 源码 ,使用<switch语句>实现学生成绩评测.
- uniapp+极光做消息推送
- 2022-2028全球视频监控软件行业调研及趋势分析报告