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格式
使用类型:

  1. 单个方法进行校验:
    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 {
}

  1. 在实体类的数据分组校验:
    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)可以指定多个分组,中间用逗号分隔

  2. 用 @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;

  1. 接口中开启校验
    public AjaxResult add(@RequestBody @Validated(value = {AddHu.class}) LxqzHu lxqzHu) {

    }
    结束语:现在通过做笔记,我才真正的学到了知识。
    本次遇到的难点。校验一直不生效,是因为 我在接口中没添加 @Validated 导致一直校验不生效。
    这是个惨痛的教训。一定要老记着这个教训。

spring注解校验相关推荐

  1. spring多参java注解_spring参数注解校验

    在写一些controller协议的时候,有些时候从前端传过来的参数较多,好的办法是定义一个实体类来封装请求参数,但是用实体类封装参数后,无法对参数值进行校验,可以使用spring的@Validated ...

  2. java spring框架 注解_史上最全的java spring注解

    史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...

  3. Spring Validation 校验

    一.概述 在 Web 应用中,客户端提交数据之前都会进行数据的校验,比如用户注册时填写的邮箱地址是否符合规范.用户名长度的限制等等,不过这并不意味着服务端的代码可以免去数据验证的工作,用户也可能使用 ...

  4. Spring注解之@validated的使用

    Spring注解之@validated的使用 spring-boot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理. 比如,我们判断一个输入参数是否合法,可 ...

  5. @async注解_史上最全的java spring注解

    史上最全的java spring注解,没有之一 注解是个好东西,但好东西我们也是看见过,整理过,理解过,用过才知道好.不求我们每个都记住,但求保有印象,在需要的时候能提取出来再查找相关资料,平时工作就 ...

  6. Spring注解编程基石(四)

    目录 AnnotationsScanner 扫描方法 扫描source为Class方法 扫描source为Method方法 辅助方法 MergedAnnotationSelector MergedAn ...

  7. @transactional注解_为啥同一个类中普通方法调用Spring注解方法,注解会失效?看完你就明白,So easy!...

    Spring注解(如@Transactional.@Cacheable.@Async等),在使用不当时,很可能会失效.失效的情况有很多种,本文我们就来瞅瞅,为啥同一个类中普通方法调用Spring注解方 ...

  8. 浅谈Spring注解

    Spring目前的趋势是使用注解结合Java代码而不是配置来定义行为.属性.功能.规则和扩展点,因此梳理注解也是梳理Spring功能点的很好的方式,全面的梳理可以补足我们知识点的漏洞. 查找所有注解 ...

  9. java spring注解维护,从一次工程启动失败谈谈 spring 注解

    原标题:从一次工程启动失败谈谈 spring 注解 檀宝权 Java 后端开发工程师,负责度假 App 后端和广告后端开发维护工作,熟悉 Tomcat,Spring,Mybatis,会点 Python ...

最新文章

  1. 程序员因中年危机从北京回老家事业单位:工资从60万爆降到6万
  2. 13.4 常见的时期类和Math类
  3. element ui 表格中的字太长,想要把多余的字变成...解决方法,一个属性即可
  4. ABAP通过正则表达式提成字符串中的数字例子
  5. Winform中使用ZedGraph实现曲线图中字体去掉边框
  6. P1101 单词方阵(DFS)
  7. MQTT的学习之Mosquitto安装使用(1)
  8. Linux下apache与tomcat完美整合笔记
  9. Spring : Spring @Transactional-嵌套事物回滚
  10. Introducing DataFrames in Apache Spark for Large Scale Data Science(中英双语)
  11. Win7下如何破解Visual Studio2008 90天试用版
  12. tf.image.resize_images
  13. C语言蒙特卡洛,蒙特卡洛(Monte Carlo)模拟法 一  ( EXCEL 举例)
  14. 《电脑音乐制作实战指南:伴奏、录歌、MTV全攻略》——第1篇 获取伴奏篇 第1章 MIDI音乐伴奏的获取与制作 1.1 电脑MIDI音乐与设备的介绍...
  15. android 网络邻居,魅族Flyme系统中怎么设置网络邻居?
  16. php api 实例maccms,api.php · do do/maccms10 - Gitee.com
  17. R语言ROC曲线下的面积 - 评估逻辑回归中的歧视
  18. C# 源码 ,使用<switch语句>实现学生成绩评测.
  19. uniapp+极光做消息推送
  20. 2022-2028全球视频监控软件行业调研及趋势分析报告

热门文章

  1. Vue的双向数据绑定原理(极简版)
  2. 作为计算机专业学生,说一说校招
  3. 【网络通信 -- 直播】项目实战记录 -- 弱网模拟工具
  4. python方法之间加点_python中技巧
  5. 大数据分析师的卓越之道
  6. 《Dive into Windbg系列》Explorer无法启动排查
  7. Systemstate Dump分析经典案例
  8. 【追踪】山东曲阜孔林附近女子被斩首续:系凶手女友
  9. IOT项目流水账 20191029
  10. 学校计算机及班班通工作责任书,学校班班通使用制度范本