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

JSR303校验教学

1、什么是JSR303校验

JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。

JSR303是提案中的一个,用来做JavaBean校验的。

JSR是一个组织,用来收集整理java规范提案。任何人都可以提交提案,组织觉得有必要就会添加到新版本的jdk里。

2、小试牛刀

【2.1】添加依赖

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.7.RELEASE</version></parent><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version><jwt.version>0.7.0</jwt.version><fastjson.version>1.2.60</fastjson.version><spring-cloud-alibaba.version>2.0.3.RELEASE</spring-cloud-alibaba.version><spring-cloud.version>Finchley.SR2</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--json--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version><scope>compile</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><classifier>exec</classifier></configuration></plugin></plugins></build>

【2.2】添加配置文件修改端口

server:port: 100

【2.3】创建实体类User

package com.jr.entry;import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.stereotype.Component;
import javax.validation.constraints.NotNull;@Component
@Data
public class User {private String id;// @NotNull   name为空地址@NotEmpty  //name为空值,空双引private String name;@Length(min = 6,max = 10)   //@Length注解不能作用在Integer属性上。private String password;}

【2.4】创建控制器

package com.jr.controller;import com.jr.entry.User;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping("/demo")
public class DemoController {@PostMapping            Validated开启JSR303校验;RequestBody 请求主体存储参数public String testJsr303(@Validated @RequestBody User user){return "ok";}
}

【2.5】创建启动类

@SpringBootApplication
public class SpringBootMain {public static void main(String[] args) {SpringApplication.run(SpringBootMain.class,args);}
}

【注意】不必创建前端页面

1.使用@PostMapping注解时,接口要想成功接受到数据,需要使用x-www-form-urlencoded数据的格式发送数据。
2.使用@PostMapping+@RequestBody注解时,接口要想成功接受到数据需要使用raw数据的格式发送数据。  
3.但是使用html静态页面发送post请求时,数据是按照application/x-www-form-urlencoded;charset=UTF-8格式发送的,格式不符合,数据接收不到。

在这里插入图片描述

使用Postman 软件解决上述问题!

在这里插入图片描述

【密码没有符合规则】

在这里插入图片描述

【用户名没有符合规则】

在这里插入图片描述

但是发现响应的值,虽然是json格式的。但是这个格式并不是咱们想要的,前台后台都是约定好的数据格式,如果你的数据格式发生了变化,那么就需要特殊处理了,很麻烦。所以我们要对响应的结果做一个处理。

3、规范返回值格式:

3.1添加ResultCode工具类

public enum ResultCode {   ///针对状态码是200的情况下,编写的工具类SUCCESS(0, "请求成功"),ERROR(1, "请求失败"),;private int code;private String message;ResultCode(int code, String message) {this.code = code;this.message = message;}public int getCode() {return code;}public String getMessage() {return message;}
}

3.2添加Result类

创建工具类 util/Result

package com.jr.util;import lombok.Data;
import java.util.HashMap;
import java.util.Map;@Data
public class Result {     //汇总所有响应情况,状态码为200,和 非200的情况。private Integer code;  private String message;private Map<String, Object> map = new HashMap<>();  private Result() {}public static Result ok() {Result r = new Result();r.setCode(ResultCode.SUCCESS.getCode());r.setMessage(ResultCode.SUCCESS.getMessage());return r;}public static Result error() {Result r = new Result();r.setCode(ResultCode.ERROR.getCode());r.setMessage(ResultCode.ERROR.getMessage());return r;}public Result put(String key, Object value) {map.put(key, value);return this;}public Object get(String key) {return map.get(key);}}

3.3添加ValidationExceptionAdvice工具类

import org.jsoft.demo.utils.Result;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;
import java.util.List;
import java.util.Map;@RestControllerAdvice("com.jr.controller")
public class ValidationExceptionAdvice {@ExceptionHandler(MethodArgumentNotValidException.class)public Result handlerMethodArgumentNotValidException(MethodArgumentNotValidException e) {BindingResult bindingResult = e.getBindingResult();List<FieldError> fieldErrors = bindingResult.getFieldErrors();Map<String, Object> map = new HashMap<>();for (FieldError fieldError : fieldErrors) {map.put(fieldError.getField(), fieldError.getDefaultMessage());}return Result.error().put("data", map);}
}

【返回值格式修改后】

在这里插入图片描述

4、ctrl中需要校验的参数类中添加注解

空检查
@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=)验证字符串长度
日期检查
@Past验证 Date 和 Calendar 对象是否在当前时间之前
@Future验证 Date 和 Calendar 对象是否在当前时间之后
数值检查建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为"",Integer为null
@Min验证 Number 和 String 对象是否大等于指定的值
@Max验证 Number 和 String 对象是否小等于指定的值
@Digits(Integer=,fraction=,message=“”)浮点型校验,Integer代表整数位数,fraction代表小数位数
格式检查
@Pattern验证 String 对象是否符合正则表达式的规则

【应用@Pattern注解】

import lombok.Data;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;/*** @author szsw* @date 2024/4/9 11:03:02*/
@Data
public class User {private String id;@NotEmptyprivate String name;@Length(min = 6, max = 10)private String password;@Pattern(regexp = "^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$", message = "请输入正确的邮箱!")private String email;}

说明:数据校验一定要前后台都校验,前台校验 可以拦截部分请求,后台检验可以 保证数据的安全性。

lic class User {

private String id;
@NotEmpty
private String name;
@Length(min = 6, max = 10)
private String password;
@Pattern(regexp = "^[A-Za-z0-9\\u4e00-\\u9fa5]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$", message = "请输入正确的邮箱!")
private String email;

}


说明:数据校验一定要前后台都校验,前台校验 可以拦截部分请求,后台检验可以 保证数据的安全性。
http://www.lryc.cn/news/529212.html

相关文章:

  • 使用DeepSeek技巧:提升内容创作效率与质量
  • 【第六天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-一种常见的贪心算法(持续更新)
  • C# Winform制作一个登录系统
  • 算法总结-哈希表
  • 向下调整算法(详解)c++
  • 蓝桥杯之c++入门(一)【C++入门】
  • 使用Python爬虫获取1688商品拍立淘API接口(item_search_img)的实战指南
  • ElasticSearch-文档元数据乐观并发控制
  • 使用Navicat Premium管理数据库时,如何关闭事务默认自动提交功能?
  • 【单细胞-第三节 多样本数据分析】
  • (java) IO流
  • 2025年1月个人工作生活总结
  • 线性调整器——耗能型调整器
  • 【2025美赛D题】为更美好的城市绘制路线图建模|建模过程+完整代码论文全解全析
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.28 存储之道:跨平台数据持久化方案
  • 拼车(1094)
  • 基于Python的人工智能患者风险评估预测模型构建与应用研究(下)
  • < OS 有关 > Android 手机 SSH 客户端 app: connectBot
  • 向量和矩阵算法笔记
  • uniapp使用uni.navigateBack返回页面时携带参数到上个页面
  • Python 梯度下降法(二):RMSProp Optimize
  • Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
  • sem_wait的概念和使用案列
  • 集合的奇妙世界:Python集合的经典、避坑与实战
  • 专业视角深度解析:DeepSeek的核心优势何在?
  • MySQL 索引存储结构
  • 【ComfyUI专栏】如何使用Git命令行安装非Manager收录节点
  • python算法和数据结构刷题[1]:数组、矩阵、字符串
  • 数据分析系列--④RapidMiner进行关联分析(案例)
  • 1/30每日一题