JSR 303学习

news2024/9/28 21:04:25

系列文章目录

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介绍
    • 1. JSR介绍
    • 2. JSR 303介绍
  • 二、PostMan官网下载
  • 三、代码实现JSR 303
    • 1. 创建Maven项目
    • 2. 添加依赖
    • 3. 创建application.yml配置文件
    • 4. 创建User实体类
    • 5. 创建DemoController控制器
    • 6. 创建启动类
    • 7. 启动项目
  • 四、规范返回值格式
    • 1. 创建ResultCode工具类
    • 2. 创建Result工具类
    • 3. 创建ValidationExceptionAdvice工具类
    • 4. 启动项目,再次发送Post请求
    • 5. 修改User实体类
    • 6. 再次启动项目,再次发送请求
  • 总结


前言

本文我们要讲述:
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:解决后端的传送数据规范的问题
在下攸攸太上,所有对我不好的人,我都会诅咒他,三天之内吃大米饭拉稀。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2174748.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

fiddler抓包12_篡改请求(请求前断点)

课程大纲 原理 正常“客户端-服务器”通信&#xff0c;即发送请求&#xff0c;接收返回。 Fiddler抓包是「客户端-浏览器」进行交互时&#xff0c;请求和响应都会从Fiddler通过&#xff0c;Fiddler可以捕获并展示。 请求前断点&#xff08;BreakPoint Before Request&#xff0…

[论文阅读] ChartInstruct: Instruction Tuning for Chart Comprehension and Reasoning

原文链接&#xff1a;http://arxiv.org/abs/2403.09028 源码链接&#xff1a;https://github.com/vis-nlp/ChartInstruct 启发&#xff1a;本文构建的instruction-tuning数据集以及使用该数据集对模型进行微调的过程都值得学习。 Abstract 研究对象&#xff1a;图表 研究…

yakit使用教程(一,下载并进行基础配置)

一&#xff0c;yakit简介 YAKIT&#xff08;Yet Another Knife for IT Security&#xff09;是一款网络安全单兵工具&#xff0c;专为个人渗透测试员和安全研究人员设计。它整合了一系列实用的安全工具&#xff0c;例如密码破解工具、网络扫描器、漏洞利用工具等&#xff0c;帮…

空间复杂度动态顺序表

目录 1>>闲话 2>>空间复杂度 3>>顺序表&#xff01;&#xff01;&#xff08;有点难度&#xff09; 3.1>>静态顺序表 3.2>>动态顺序表 3.2.1>>初始化动态顺序表 3.2.2>>实现尾插 4>>结语 1>>闲话 感谢大家对小…

【YOLO目标检测反光衣数据集】共2388张、已标注txt格式、有训练好的yolov5的模型

目录 说明图片示例 说明 数据集格式&#xff1a;YOLO格式 图片数量&#xff1a;2388 标注数量(txt文件个数)&#xff1a;2388 标注类别数&#xff1a;2 标注类别名称&#xff1a;reflective_clothes、other_clothes 数据集下载&#xff1a;反光衣数据集 图片示例 数据…

HJ50-四则运算:栈的运用、中缀表达式转后缀表达式并计算结果

文章目录 题目一、分析1.1表达式预处理1.2中缀表达式转后缀1.3 后缀表达式计算结果 二、答案 题目 一、分析 通过利用栈将中缀表达式转换为后缀表达式&#xff0c;在根据后缀表达式计算运算结果。由于包含负数操作数的情况&#xff0c;并且操作数位数不固定为1&#xff0c;因此…

【算法篇】二叉树类(3)(笔记)

目录 一、Leetcode 题目 1. 二叉树的最近公共祖先 2. 二叉搜索树的最近公共祖先 &#xff08;1&#xff09;递归法 &#xff08;2&#xff09;迭代法 3. 二叉搜索树中的插入操作 &#xff08;1&#xff09;递归法 &#xff08;2&#xff09;迭代法 4. 删除二叉搜索树中…

时间序列LSTM实现

这个代码参考了时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)_lstm预测模型-CSDN博客 结合我之前所学的lstm-seq2seq里所学习到的知识对其进行预测 import time import numpy as np import pandas as pd import torch import…

革命题材网络电影《突进夹金山》将于10月上线

“长征万里险&#xff0c;最忆夹金山”。这座雪山不仅见证了红军战士们的英勇与牺牲&#xff0c;也成为了中国革命历史上的一座重要里程碑。 革命题材网络电影《突进夹金山》&#xff0c;作为四川省2024年度重点影视剧项目以及纪念红军长征90周年献礼的红色作品&#xff0c;由谢…

死磕P7: JVM类加载那些事儿,一起探知类的前世今生(二)

这是「死磕P7」系列第 006 篇文章&#xff0c;欢迎大家来跟我一起 死磕 100 天&#xff0c;争取在 2025 年来临之际&#xff0c;给自己一个交代。 接上篇&#xff0c;上一篇介绍了 JVM 类加载过程及类的生命周期&#xff0c;回顾一下&#xff1a; 死磕P7: JVM类加载那些事儿&a…

周文强聚焦助学育人,爱心图书室项目圆满完成

日前&#xff0c;一场充满爱心与希望的公益活动在四川甘孜州乡城县尼斯寄宿制小学拉开帷幕。这次名为“520爱心图书室”的公益活动&#xff0c;旨在通过捐赠图书的方式&#xff0c;支持基层青少年的阅读成长。作为此次活动的积极参与者&#xff0c;周文强不仅向学校捐赠了价值1…

python 高效读取多个geojson 写入一个sq3(Sqlite) 、效率提高90%+

1.问题缘由&#xff1a; 由于工作需求&#xff0c;需要将多个&#xff08;总量10G&#xff09;geojson文件写入到sq3库&#xff0c;众所周知&#xff0c;sqlite 不支持多线程写入&#xff0c;那该怎么办呢&#xff0c;在网上也查了很多策略&#xff0c;都没有达到立竿见影的效果…

甄选范文“论分布式存储系统架构设计”,软考高级论文,系统架构设计师论文

论文真题 分布式存储系统(Distributed Storage System)通常将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式存储系统采用可扩展的…

车辆重识别(去噪扩散概率模型)论文阅读2024/9/27

[2] Denoising Diffusion Probabilistic Models 作者&#xff1a;Jonathan Ho Ajay Jain Pieter Abbeel 单位&#xff1a;加州大学伯克利分校 摘要&#xff1a; 我们提出了高质量的图像合成结果使用扩散概率模型&#xff0c;一类潜变量模型从非平衡热力学的考虑启发。我们的最…

linux驱动设备程序(内核层、应用层)

一、linux驱动程序 1、分类 字符设备&#xff08;驱动&#xff09;、块设备&#xff08;驱动&#xff09;、网络设备&#xff08;驱动&#xff09;。 2、核心 应用程序运行在用户空间&#xff08;3G&#xff09;&#xff1b;<系统调用>——><陷入>——>&…

正则表达式在过滤交换机lldp信息的应用举例

#include <iostream> #include <string> #include <regex> #include <vector> #include <unordered_map> #include <sstream> #include <unistd.h> // For usleep// 假设存在的 LOG_INFO 和 LOG_WARNING 函数 #define LOG_INFO(...)…

17.第二阶段x86游戏实战2-线程发包和明文包

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

基于docker-compose部署openvas

目录 0.部署openvas 1.编辑docker-compose文件 2.运行compose 3.访问openvas 4.openvas扫描 5.创建任务 6.点击Task Wizard ​编辑 7.输入通讯的IP地址 8.下载报告 9.下载完成 0.部署openvas 1.编辑docker-compose文件 vim docker-compose.yaml version: 3service…

《论文阅读》 用于产生移情反应的迭代联想记忆模型 ACL2024

《论文阅读》 用于产生移情反应的迭代联想记忆模型 ACL2024 前言简介任务定义模型架构Encoding Dialogue InformationCapturing Associated InformationPredicting Emotion and Generating Response损失函数问题前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦…

通信工程学习:什么是MAI多址干扰

MAI:多址干扰 MAI多址干扰(Multiple Access Interference)是无线通信领域,特别是在码分多址(CDMA)系统中,一个关键的干扰现象。以下是对MAI多址干扰的详细解释: 一、定义 多址干扰是指在CDMA系统中,由于多个用户的信号在时域和频域上是混叠的,从而导…