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

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;
    @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;

}

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

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.kler.cn/a/525748.html

相关文章:

  • Git 版本控制:基础介绍与常用操作
  • 数据结构与算法之栈: LeetCode 739. 每日温度 (Ts版)
  • dify实现原理分析-rag-检索(Retrieval)服务的实现
  • 71-《颠茄》
  • ios swift画中画技术尝试
  • Java 在包管理与模块化中的优势:与其他开发语言的比较
  • 某盾Blackbox参数参数逆向
  • 网络安全技术简介
  • Linux gdisk 命令使用详解
  • 跨平台物联网漏洞挖掘算法评估框架设计与实现文献综述之总结与展望
  • 未来可期|在真实与虚拟之间:AI+游戏如何再造娱乐体验
  • 74-《猴面小龙兰》
  • EtherCAT主站IGH-- 22 -- IGH之fsm_sii.h/c文件解析
  • unity学习23:场景scene相关,场景信息,场景跳转
  • HCIA-Access V2.5_10_1_PPP协议
  • 【Block总结】OutlookAttention注意力,捕捉细节和局部特征|即插即用
  • vim操作简要记录
  • 日志技术的使用
  • 网络编程套接字(上)
  • QPS 值是怎样进行计算和应用的
  • 【时时三省】(C语言基础)文件的随机读写
  • docker中运行的MySQL怎么修改密码
  • 【go语言】gorm 快速入门
  • 2021版小程序开发4——基础加强
  • 《深入浅出HTTPS​​​​​​​​​​​​​​​​​》读书笔记(31):HTTPS和TLS/SSL
  • 大数据Hadoop入门2