使用JSR-303进行校验

JSR303校验 前端请求后端接口传输参数,是在controller中校验还是在Service中校验?答案是都需要校验,只是分工不同。Contoller中校验请求参数的合法性,包括:必填项校验,数据格式校验,比如:是否是符合一定的日期格式,等。Service中要校验的是业务规则相关的内容,比如:课程已经审核通过所以提交失败。Service中根据业务规则去校验不方便写成通用代码,Controller中则可以将校验的代码写成通用代码。 阅读详情

一、JSR303定义的校验类型

空检查 
@Null验证对象是否为null
@NotNull验证对象是否不为null, 无法查检长度为0的字符串
@NotBlank检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty检查约束元素是否为NULL或者是EMPTY.
Booelan检查 
@AssertTrue验证 Boolean 对象是否为 true
@AssertFalse验证 Boolean 对象是否为 false
长度检查 
@Size(min=, max=)验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length(min=, max=)Validates that the annotated string is between min and max included.
日期检查 
@Past验证 Date 和 Calendar 对象是否在当前时间之前
@Future验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern验证 String 对象是否符合正则表达式的规则
数值检查建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min验证 Number 和 String 对象是否大等于指定的值
@Max验证 Number 和 String 对象是否小等于指定的值
@DecimalMax被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度
@DecimalMin被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度
@Digits验证 Number 和 String 的构成是否合法
@Digits(integer=,fraction=)验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。
@Range(min=, max=)检查数字是否介于min和max之间.
@Range(min=10000,max=50000,message=“range.bean.wage”)private BigDecimal wage;
@Valid递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证)
@CreditCardNumber信用卡验证
@Email验证是否是邮件地址,如果为null,不进行验证,算通过验证。
@ScriptAssert(lang= ,script=, alias=) 
@URL(protocol=,host=, port=,regexp=, flags=) 

二、在SringMVC中使用

使用注解

1、准备校验时使用的JAR

validation-api-1.0.0.GA.jar:JDK的接口;

hibernate-validator-4.2.0.Final.jar是对上述接口的实现;

log4j、slf4j、slf4j-log4j

2、编写需要校验的bean

@NotNull(message="名字不能为空")
private String userName;
@Max(value=120,message="年龄最大不能查过120")
private int age;
@Email(message="邮箱格式错误")
private String email;

3、校验方法

@RequestMapping("/login")
public String testValid(@Valid User user, BindingResult result){
    if (result.hasErrors()){
        List<ObjectError> errorList = result.getAllErrors();
        for(ObjectError error : errorList){
            System.out.println(error.getDefaultMessage());
        }
    }
    return "test";
}

备注:这里一个@Valid的参数后必须紧挨着一个BindingResult 参数,否则spring会在校验不通过时直接抛出异常

前台可以使用spring的标签库也可以自己自定义处理

4、spring标签库的用法

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>   
  
<html>   
<head>   
<title>Reservation Form</title>   
<style>   
.error {   
    color: #ff0000;   
    font-weight: bold;   
}   
</style>   
</head>   
  
<body>   
    <form:form method="post" modelAttribute="vm">   
        <form:errors path="*" cssClass="error" />   
        <table>   
            <tr>   
                <td>Name</td>   
                <td><form:input path="userName" />   
                </td>   
                <td><form:errors path="userName" cssClass="error" />   
                </td>   
            </tr>   
            <tr>   
                <td>email</td>   
                <td><form:input path="email" />   
                </td>   
                <td><form:errors path="email" cssClass="error" />   
                </td>   
            </tr>   
       
            <tr>   
                <td colspan="3"><input type="submit" />   
                </td>   
            </tr>   
        </table>   
    </form:form>   
</body>   
</html>

5、开启spring的Valid功能

<mvc:annotation-driven />

三、自定义校验类型

1、需要验证的实体 Bean

public class LoginVo {
    
    @NotNull
    @IsMobile //自定义的注解
    private String mobile;
    
    @NotNull
    @Length(min=32)
    private String password;
    
    //省略 get set 方法
}

2、自定义 IsMobile 注解类

import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
import static java.lang.annotation.ElementType.CONSTRUCTOR;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;
 
@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = {IsMobileValidator.class })
public @interface  IsMobile {
    
  //允许为空的属性
    boolean required() default true;
 
    //如果校验不通过返回的提示信息
    String message() default "手机号码格式错误";
 
    Class<?>[] groups() default { };
 
    Class<? extends Payload>[] payload() default { };
}

3、校验器

import  javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.apache.commons.lang3.StringUtils;
import com.imooc.miaosha.util.ValidatorUtil;
 
//IsMobile:自定义的注解
//String:注解参数类型
public class IsMobileValidator implements ConstraintValidator<IsMobile, String> {
 
  //默认值_false,用于接收注解上自定义的 required
    private boolean required = false;
    
  //1、初始化方法:通过该方法我们可以拿到我们的注解
    public void initialize(IsMobile constraintAnnotation) {
 
        //constraintAnnotation.required() 接收我们自定义的属性,是否为空
        required = constraintAnnotation.required();
    }
 
  //2、逻辑处理
    public boolean isValid(String value, ConstraintValidatorContext context) {
 
        //2.1、如果允许为空的话,直接返回结果
        if(required) {
            return ValidatorUtil.isMobile(value);
        }else {
        //2.2、不允许为空
            //2.2.1、验证是否为空
            if(StringUtils.isEmpty(value)) {
                return true;
            }else {
                return ValidatorUtil.isMobile(value);
            }
        }
    }
 
}

4、总结

自定义注解需要去手动实现两个文件:自定义注解类+ 注解校验器类

自定义注解类:message() + groups() + payload() 必须;

注解校验器类:继承 ConstraintValidator 类<注解类,注解参数类型> + 两个方法(initialize:初始化操作、isValid:逻辑处理)

 

往期精彩内容:

超详细的springBoot学习笔记

Java多线程基础知识总结(绝对经典)

Java面试题总结(附答案)

Vue基础知识总结(绝对经典)

常见数据结构与算法整理总结

 

 

Springboot集成JSR303参数校验 JSR303 是一套 JavaBean 参数校验的标准 1、pom导入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependenc... 阅读详情

相关推荐

JSR303 数据校验

JSR-303是Java平台的Bean Validation规范,旨在为Java应用程序提供基于注释的数据验证。其全称为Java Specification Request 303。下面按照JSR-303定义的常见注解名称进行列出,并解释了每个注解表示的数据校验约束。1. @NotNull:校验属性不为null,可以用于校验任意类型的属性。2. @NotEmpty:校验属性不能为空,可以用于验证字符串、数组、集合等类型的属性。

javaxueba的博客 723

SpringBoot:yaml注入,JSR303数据校验

一、yaml YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。 yaml语法采用多行缩进,对比XML格式,yaml精简、可读性高 yaml语法格式: 属性:空格 值 以缩进来控制层级关系,只要左对齐则是同一级 大小写十分敏感 二、yaml注入

半山腰太挤了,你要去山顶看看 1070

fluent二维叶型仿真_Fluent案例4【自然对流】

自然对流来了!!江苏的高校好多开学了,我啥时候才能开学另外,刚才看了何同学的Mac Pro深度体验视频,我好酸/(ㄒoㄒ)/~~好想拥有一台跑仿真那种sou~sou~sou~的机器。废话不多说了,进入正题!案例题目:一个矩形空腔内有500K恒温小球,矩形空腔充斥空气,边界条件绝热,模型尺寸如下,试模拟空腔内空气流动状态做出温度变化图。(尺寸大小懒得写了,在建模部分里有)操作平台:workbench...

weixin_39724469的博客 3670

JSR303 参数校验

什么是JSR303 参数校验? JSR303 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们 JavaBean 的属性上面,就是类里面的字段上面,就可以在需要校验的时候进行校验了。 怎么使用JSR303? 导入 validation 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st

Java 领域技术分享 1314

VC Spyglass CDC实战:从TCL脚本到SDC约束的完整避坑指南

本文是一份针对数字IC验证工程师的VC Spyglass CDC实战指南。文章详细阐述了从TCL脚本环境搭建、SDC约束编写到典型CDC违规(如SETUP_PORT_UNCONSTRAINED)诊断与修复的完整流程,旨在帮助读者高效避坑,深入理解工具逻辑,从而完成可靠的时钟域交叉验证。

go5gopher的博客 385

RK3588上rknn_toolkit_lite2报错解决:手把手教你更新librknnrt.so的正确姿势

本文针对在RK3588平台上使用rknn_toolkit_lite2时遇到的“Invalid RKNN model version”等常见错误,提供了完整的诊断与解决方案。文章深入剖析了RKNN生态系统各组件(如librknnrt.so、RKNN Server)版本不兼容的根源,并手把手指导如何安全、正确地更新librknnrt.so运行时库,确保AI模型在RK3588 NPU上实现高效推理。

weixin_29189003的博客 521

JSR303校验详解(基础校验,分组校验,自定义校验)结合 全局异常处理捕获校验异常

详解jsr303校验

weixin_51751186的博客 2534

数仓 - 促销敏感度、评论敏感度

1. 促销敏感度 步骤1. 首先按照最后一次下单时间及有无复购情况将用户分为四大群体: 近一年有购物行为且复购的用户 -- L1 (今年复购用户) 近一年有购物行为但无复购的用户 --L2 (今年一单购用户) 最后一次下单时间在1年之前且有复购的用户 --L3 (今年无购且只有一单用户) 最后一次下单时间在1年之前但无复购的用户 -- L4 (今年无购多单用户) 步骤2. 每一类用户群再根据优惠订单占比、每单优惠金额占比的平均值、优惠金额这三个指标进行k-means聚类,分为: 非常敏感 -

weixin_41332009的博客 1900

数据校验 JSR303校验

一:校验需求 对前端传来入参做数据合法性检查。 二:校验方法 1. 拼接式校验 1.1 定义 在业务成对request中的参数一个个做非空判断。 1.2 举例 Stu.java @Data @EqualsAndHashCode(callSuper = false) public class Stu implements Serializable { private static final long serialVersionUID = 1L; .........

weixin_48568302的博客 2058

光储微电网混合储能系统的控制策略

随着社会生产力的不断提高,对不可再生资源的大量消耗,人们已经意识到发展可再生能源的重要性,因此微电网技术作为再生能源利用的有效形式被快速发展。蓄电池容量无限大是传统光储微电网混合储能系统控制策略一种理想形式,但实际上蓄电池的容量是有限度的,传统控制策略在蓄电池剩余电量达到阖值时将无法正常使用,由此提出了光储微电网混合储能系统的新型控制策略,又结合实际情况,对开关进行了改进,利用开关与二极管并联,使其拥有四种工作状态,当储能元件剩余电量达到阈值时,可自动恢复电量降低成本,提高并输出电池电能质量。

nhkg888的博客 1744

Uni-App 使用极光推送完整指南

Uni-App集成极光推送的完整指南:从注册极光账号到代码实现。包含前期准备(获取AppKey、注册厂商账号)、Uni-App配置(插件导入、初始化代码)、高级功能(角标设置、Java后台接口)及常见问题排查。详细说明了推送监听、registrationID获取、消息接收处理等核心功能实现步骤,并提供两种推送接口示例(按平台推送和统一推送)。适合需要在Uni-App项目中实现推送功能的开发者参考。

cyj0919的博客 430

JSR303后端校验详解

什么是JSR303? JSR 303 - Bean Validation提供了一种后端数据校验支持,如果一键f12修改前端代码成功绕过前端校验,那么就会存入非法数据,所以后端校验十分重要。应该前端+后端+数据库的校验约束都不能少,全面保障数据规范安全。

有一分热,发一分光。 6035

python+playwright 学习-10.pytest-playwright插件编写测试用例

pytest-playwright插件完美的继承了pytest 用例框架和playwright基础使用的封装,基本能满足工作中的常规需求了,不需要我们再做额外的插件开发。

qq_27371025的博客 2519

JSR303参数校验

1、Spring mvc 的表单验证 客户端表单验证:代码写在js上,容易被攻击。 服务端表单验证 :不容易被攻击,它是在后台进行验证就不会被人恶意攻击,不容易被人随意登陆其他的信息或者窃取他人信息。 如果使用需要JSR303 ,就要导入hibernate-validator依赖 &lt;dependency&gt; &lt;groupId&gt;org.hibernate&lt;/g...

cao_2000的博客 2498

RH850从0搭建Autosar开发环境系列讲解 - 总目录

Davinci Autosar实战开发从0构建开发能力。OS,COM,DCM,BSWMM,ECUM,VLINK,XCP,MEMMAP等模块配置,带你熟悉运行的autosar代码,包括MICROSAR的启动运行,使用GreenHills生成运行的hex。

weixin_42412049的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SpringBoot后端进行数据校验——JSR303的使用

原创不易,未经允许,请勿转载。 博客主页:https://blog.youkuaiyun.com/qq_43058685?spm=1001.2014.3001.5343 如果只想查看注解,请跳到文章末尾部分 文章目录简介项目创建传统的检验方式使用JSR303自定义错误信息错误信息的获取与响应错误异常类型补充分组校验自定义校验常用注解汇总 简介 在前后端进行数据交互中,在前端把数据传送到后端前,一般会先进行校验一次,校验成功之后,才把数据发送到后端。但是我们在服务端还得在对数据进行一次校验。因为请求数据发送的链接很容.

江小举的博客 4115

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JSR303统一校验

jsr 是 Java Specification Requests 的缩写,意思是java的请求规范。周志明老师的书上还着重介绍过jsr292(jvm多语言支持包括Kotlin,Clojure,JRuby,Scala等)。

AiFlutter的博客 1065

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java中JSR303校验

JSR303统一校验

AiFlutter的博客 1122

spring中使用@Validated,什么是JSR 303数据校验,spring boot中怎么使用数据校验

spring、spring boot

zhangfuping123456789的博客 5822

JSR303校验教学

JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。JSR303是提案中的一个,用来做JavaBean校验的。JSR是一个组织,用来收集整理java规范提案。任何人都可以提交提案,组织觉得有必要就会添加到新版本的jdk里。

weixin_62951914的博客 946

Spring Boot使用JSR303校验

Hibernate Validator JSR-303 JSR-349

qq_33594592的博客 1304

springboot使用JSR303对数据进行校验

在前后端分离项目中,前端通过制定rules校验数据,能最早的让用户发现输入错误,如果使用postman发送数据,就会跳过前端校验,因此需要后端同样需要做验证。 步骤 1.给bean添加校验注解 导入 javax.validation.constraints,并定义自己的message提示 @NotBlank(message = "账号不能为空") private String account; @NotBlank(message = "密码不能为空") private Stri

qq_1149513559的博客 1552

JSR-303 参数校验

早期的参数校验形式 在早期的时候,java的参数校验停留在获取参数之后在代码层面做校验,类似如下操作: @PostMapping("/test") public String test(@RequestBody TestRequest request) { if (StringUtils.isEmpty(request.getName())) { return "姓名不能为空"; } if (request.getName().length() > 6) {

to_real的博客 476

SpringMVC框架 |JSR303数据校验

文章目录一、JSR303二、JSR303的使用步骤第一步:导入jar包/添加Maven依赖:第二步:在bean中为属性加上注解第三步:告诉SpringMVC需要校验的JavaBean普通表单回显错误信息三、自定义国际化错误消息的显示1.编写国际化文件 一、JSR303 只做前端校验是不安全的,重要的数据一定要加上后端验证。可以在程序中将每一条数据取出校验,如果校验失败直接来到添加页面,提示其重新...

匿名攻城狮 2193
上一篇: 《重构 改善既有代码的设计 3》代码的可理解性应该是我们虔诚追求的目标
下一篇: jdbctemplate使用 | Spring Boot 23
哪 吒
哪 吒 2022年度博客之星TOP 1 2022年度博客之星TOP 1 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 59万+粉丝 2953原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值