首页 > 其他分享 >JSR 303学习

JSR 303学习

时间:2024-09-28 17:50:22浏览次数:3  
标签:303 springframework 学习 JSR org import public

系列文章目录

JavaSE
基础知识、数据类型学习万年历项目代码逻辑训练习题
代码逻辑训练习题方法、数组学习图书管理系统项目
面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习
集合学习IO流、多线程学习仓库管理系统JavaSE项目
员工管理系统、多表查询、反射实现DBHelper学习DML、DDL、数据库对象学习
JavaWeb
网络编程、各种标签、CSS学习ECMAScript、BOM学习DOM、jQuery学习
Servlet、JSP、Cookie、Ajax学习融资管理系统JavaWeb项目
框架
MyBatis框架学习逆向工程、Spring框架IOC、AOP学习SpringMVC框架学习
SpringBoot框架学习招聘网站框架项目Vue介绍、窗体内操作、窗体间操作学习
Vue路由配置、网络请求访问框架项目、element组件介绍学习标准管理系统Vue项目
微服务
Linux安装、Nginx反向代理、负载均衡学习Docker学习Jenkins学习
Nexus学习Spring Security学习RabbitMQ学习
Redis学习MongoDB学习MongoDB学习
Nacos学习Spring Session学习Spring Gateway学习
JSR 303学习

文章目录


前言

本文我们要讲述:
JSR 303
在下攸攸太上。


一、JSR 303介绍

1. JSR介绍

JSR是Java Specification Requests的缩写,意为Java规范请求。它是由Java社区制定的一种规范制定流程,用于制定和更新Java平台的规范、API和相关技术标准。JSR的制定过程是由Java社区的成员共同参与和协作完成的,其中包括Java开发者、组织、厂商和其他利益相关者。

JSR的制定包括以下步骤:
1、提出:制定组织或个人向Java社区提出制定新的规范或修改现有规范的需求。
2、制定:制定组织或个人负责制定并提交规范的草案,然后由专家组进行讨论和审查。
3、审查:经过审查后,规范的终稿将被提交给Java社区的成员进行最终的投票表决。
4、采纳:如果规范的终稿被通过,它将成为正式的Java规范,得到采纳并实施。
通过JSR的制定,Java社区可以确保Java平台的发展是开放和协作的,各种新的技术和标准可以得到规范化并得到广泛支持和应用。

2. JSR 303介绍

JSR 303是Java规范中定义的Bean Validation规范,用于在Java应用程序中进行数据验证和约束。JSR 303提供了一种基于注解的方式来定义对象的验证规则,可以在运行时对对象进行验证,确保其符合预先定义的规则。

在JSR 303中,可以使用一系列内置的验证注解来定义对象的验证规则,例如@NotNull、@Size、@Min、@Max等。开发者还可以通过编写自定义的验证注解来扩展验证规则。

JSR 303的主要目的是简化数据验证的实现,提高代码的可维护性和可读性。通过使用JSR 303,开发者可以在对象上定义验证规则,并使用验证器来验证对象是否符合这些规则。这样可以避免编写大量重复的验证代码,使得数据验证变得更加简单和高效。JSR 303已经成为Java EE平台的一部分,并得到了广泛的应用。

二、PostMan官网下载

PostMan官网下载
点一下就能下载了,下载完点一下就能用了,超级方便!!

三、代码实现JSR 303

1. 创建Maven项目

在这里插入图片描述
项目结构:
在这里插入图片描述

2. 添加依赖

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

3. 创建application.yml配置文件

server:
  port: 100

4. 创建User实体类

package com.jjy.entry;

import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.stereotype.Component;
import javax.validation.constraints.NotEmpty;

@Component
@Data
public class User {
    private String id;
    // @NotNull   name为空地址
    @NotEmpty  //name为空值,空双引
    private String name;
    @Length(min = 6,max = 10)
    private String password;
}

5. 创建DemoController控制器

package com.jjy.controller;

import com.jjy.entry.User;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/demo")
public class DemoController {

    @PostMapping
    public String testJsr303(@Validated @RequestBody User user){
        return "ok";
    }
}

6. 创建启动类

package com.jjy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

7. 启动项目

在这里插入图片描述
发送如下Post请求:

{
    "name":"zhangsan",
    "password":"12345678"
}	

出现成功
在这里插入图片描述
发送如下Post请求:

{
    "name":"zhangsan",
    "password":"128"
}

出现提示密码长度不符合规范
在这里插入图片描述
发送如下请求:

{
    "password":"12345678"
}

出现提示用户名不能为空
在这里插入图片描述

四、规范返回值格式

1. 创建ResultCode工具类

package com.jjy.util;

public enum ResultCode {

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

2. 创建Result工具类

package com.jjy.util;


import lombok.Data;
import java.util.HashMap;
import java.util.Map;

@Data
public class Result {

    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. 创建ValidationExceptionAdvice工具类

package com.jjy.utils;

import com.jjy.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.jjy.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. 启动项目,再次发送Post请求

{
“name”:“”,
“password”:“123”,
“email”:“1234r”
}
在这里插入图片描述

5. 修改User实体类

package com.jjy.entry;


import lombok.Data;
import org.hibernate.validator.constraints.Length;
import org.springframework.stereotype.Component;

import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;

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

}

6. 再次启动项目,再次发送请求

请求信息与上次的相同
在这里插入图片描述


总结

本文讲述了:
JSR 303:解决后端的传送数据规范的问题
在下攸攸太上,所有对我不好的人,我都会诅咒他,三天之内吃大米饭拉稀。

标签:303,springframework,学习,JSR,org,import,public
From: https://blog.csdn.net/howwickhappy/article/details/142610012

相关文章

  • Spring Gateway学习
    系列文章目录JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工管理系统、......
  • 深度学习入门
    目录深度学习定义深度学习的发展背景神经网络基础深度学习与传统机器学习的关系深度学习定义   深度学习是机器学习的一个分支,它模仿人脑处理数据和创建模式的方式,用于解决复杂的模式识别问题。与传统的机器学习方法相比,深度学习能够自动从原始数据中学习到更高层......
  • d2l-ai深度学习日记(四)-深度学习计算
    前言:这个博客《d2l-ai深度学习日记》将记录我在深度学习领域的学习与探索,特别是基于《动手学深度学习》这本经典教材的学习过程。在这个过程中,我不仅希望总结所学,还希望通过分享心得,与志同道合的朋友一起交流成长。这不仅是对知识的沉淀,也是我备战研究生考试、追逐学术进阶之......
  • d2l-ai深度学习日记(三)-多层感知机
     前言:这个博客《d2l-ai深度学习日记》将记录我在深度学习领域的学习与探索,特别是基于《动手学深度学习》这本经典教材的学习过程。在这个过程中,我不仅希望总结所学,还希望通过分享心得,与志同道合的朋友一起交流成长。这不仅是对知识的沉淀,也是我备战研究生考试、追逐学术进阶......
  • Redis学习笔记
    一、Redis简介1.1NOSQLNoSQL(NoSQL=NotOnlySQL),意即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型,web2.0纯动态网站已经显得力不从心,暴露了很多难以克服......
  • CMake构建学习笔记18-cpp-httplib库的构建
    cpp-httplib库是笔者认为的一个比较好用的基于C++的Http服务器组件,与Eigen一样,它也是基于头文件的库,我们只需要引入httplib.h这个头文件进行来就实现所有基于http/https协议的功能,非常适合初学者进行使用。尽管是头文件,还是可以使用CMake进行构建,便于统一管理,关键脚本如下:#配置......
  • 【机器学习】ID3、C4.5、CART 算法
    目录常见的决策树算法1.ID32.C4.53.CART决策树的优缺点优点:缺点:决策树的优化常见的决策树算法1.ID3ID3(IterativeDichotomiser3)算法使用信息增益作为特征选择的标准。它是一种贪心算法,信息增益表示按某特征划分数据集前后信息熵的变化量,变化量越大,表示使用该......
  • sql学习笔记
    DDL各种数据类型mysql数据类型decimal参考:https://blog.csdn.net/qq_38228254/article/details/88374713decimal(a,b) a指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。 b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从0到a之间......
  • RISC-V学习笔记
    文档介绍:https://www.cnblogs.com/mikewolf2002/p/9654946.html中文手册:http://crva.ict.ac.cn/documents/RISC-V-Reader-Chinese-v2p1.pdf所有立即数都被拓展成32位。opcode指定总体功能,同时决定了指令格式。funct指定了具体的小功能。压缩指令集......
  • 李宏毅 机器学习
    P6自注意力机制引言:    到目前为止,在预测或者图像识别(已经假设了图像大小是相等的)的任务中,都是将输入看作是一个向量,输出可能是数值(回归任务)也可能是类别(分类任务),那假如输入是一排向量或者这个向量长度是改变的呢?例如:输入形式        (一)句子     ......