谷粒商城实战笔记-66-商品服务-API-品牌管理-JSR303数据校验

文章目录

  • 一,引入JSR 303依赖
  • 二,接口参数启用校验功能
  • 三,给字段添加校验注解
    • `@NotBlank` 和 `@NotNull` 的区别
      • @NotBlank
      • @NotNull
      • 比较
  • 四,BindingResult获取校验结果
  • 五,自定义错误消息
  • 六,其他校验规则

在Web应用程序中,数据的有效性和合法性至关重要。前端虽能提供初步的表单校验,但在后端再次进行校验是必要的,以确保数据的质量并保护系统免受恶意输入的影响。

这一节详细介绍如何在Spring Boot项目中使用JSR 303(Java Specification Request 303)进行数据校验。

一,引入JSR 303依赖

JSR 303定义了一组用于Java Bean属性校验的标准注解。Spring Boot框架内置了对JSR 303的支持,这使得我们可以在实体类中轻松添加校验逻辑。

springboot2.3.0以上需要手动引入依赖,引入到common模块中。

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>2.3.2.RELEASE</version></dependency>

还在在product模块的配置文件中新增如下配置:

server:error: #303校验错误信息提示include-binding-errors: alwaysinclude-message: always

如果没有以上配置,则后端不会在响应中返回

二,接口参数启用校验功能

  • BrandController:
    • @Valid: 标注在接收Brand对象的方法参数上,表示该对象需要进行校验。如下在save方法的brand参数前加了注解@Valid,标识要对这个对象进行校验,校验规则由该类字段上的注解确定。
    • BindingResult: 紧跟在被校验的对象之后,用于获取校验结果。

三,给字段添加校验注解

在需要校验的实体类的自动上添加对应的注解,以BrandEntity为例。

  • @NotBlank: 标注在品牌名字段上,表示该字段必须包含至少一个非空字符。
public class BrandEntity{@NotBlank(message="name不能为空")private String name;// 其他字段和getter/setter...
}

添加了注解后,如果参数不符合校验规则,后端会中断请求,在响应中包含错误提示信息。

  • 发送POST请求到/brands/save端点,提交一个空的品牌名称。
  • 验证响应状态码为400 Bad Request
  • 查看响应体中的错误信息。

在这里插入图片描述

@NotBlank@NotNull 的区别

@NotBlank@NotNull 是 Java 中用于验证输入数据的两种不同的注解,它们都属于 JSR 303/JSR 349 (Hibernate Validator) 的一部分,用于 Spring Boot 和其他基于 Java 的 Web 应用程序中进行数据校验。

@NotBlank

此注解用于检查字符串类型的值是否为空(null)、空字符串 ("") 或仅由空白字符组成。如果字符串为空、为空字符串或只包含空白字符,则验证失败。适用于 String 类型。

示例用法:

@NotBlank(message = "品牌名必须提交")
private String name;

@NotNull

此注解用于检查值是否为 null。与 @NotBlank 不同,@NotNull 可以应用于任何类型的变量,不仅仅限于字符串。如果一个对象为 null,则验证失败。

示例用法:

@NotNull(message = "Logo必须提交")
private String logo;

比较

  • 适用范围:

    • @NotBlank: 仅适用于 String 类型。
    • @NotNull: 可以应用于任何类型。
  • 验证条件:

    • @NotBlank: 检查字符串是否为空、为空字符串或仅由空白字符组成。
    • @NotNull: 检查对象是否为 null。

四,BindingResult获取校验结果

当校验不通过时,默认的响应数据结构可能不符合我们的要求,可以通过BindingResult在接口中获取校验信息,封装为自定义的响应结构。

让我们通过具体的例子来看看其是如何工作的。

我们可以通过BindingResult获取校验结果,并将其封装在一个Map中,返回给前端。

import javax.validation.```java
@RestController
@RequestMapping("/brands")
public class BrandController {@RequestMapping("/save")public R save(@Valid @RequestBody BrandEntity brand, BindingResult result){if(result.hasErrors()){Map<String,String> map = new HashMap<>();//1、获取校验的错误结果result.getFieldErrors().forEach((item)->{//FieldError 获取到错误提示String message = item.getDefaultMessage();//获取错误的属性的名字String field = item.getField();map.put(field,message);});return R.error(400,"提交的数据不合法").put("data",map);}brandService.save(brand);return R.ok();}}

接口接收到不合法的参数后,会给出如下响应,更灵活更清晰,可读性更强。

在这里插入图片描述

五,自定义错误消息

每个注解都有默认的错误提示,配置在ValidationMessages.properties文件中。

在这里插入图片描述

但是,我们可以在自动注解的message属性自定义错误提示。

@NotNull(message = "Logo必须提交")
private String logo;

六,其他校验规则

除了品牌名,我们还可以为其他字段添加校验注解,例如:

  • Logo URL:
    • @NotNull & @URL: 标注在Logo字段上,表示该字段必须不为空且是一个有效的URL。
@NotNull(message = "Logo必须提交")
@URL(message = "Logo必须是一个合法的URL地址")
private String logo;
  • First Letter:
    • @Pattern: 标注在首字母字段上,表示该字段必须满足特定的正则表达式。
@Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母必须是一个字母")
private String firstLetter;
  • Sort:
    • @Min: 标注在排序字段上,表示该字段必须大于等于0。
@Min(value = 0, message = "排序必须大于等于0")
private Integer sort;

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

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

相关文章

【AIGC】构建自己的谷歌搜索引擎服务并使用

一、谷歌 谷歌的搜索引擎需要自己创建服务才能启用检索api。&#xff08;需自行翻墙和创建自己的谷歌账号&#xff09; 1.1 API服务创建 1&#xff09;登陆https://console.cloud.google.com/: 2&#xff09; 选择新建项目&#xff0c;取号项目名即可&#xff08;比如:Olin…

【Java】/* 异常 */

目录 ​编辑 一、错误和异常的体系 二、异常 2.1 异常的分类 2.2 异常的处理形式 2.3 如何抛出异常 2.4 捕获处理异常 2.5 finally存在的意义 2.6 异常处理流程总结 2.7 自定义异常类 一、错误和异常的体系 1. Java中所有的异常和错误都有对应的类来进行描述。 2. 由…

【日常记录】【JS】JS中查询参数处理工具URLSearchParams

文章目录 1. 引言2. URLSearchParams2.1 URLSearchParams 的构造函数2.2 append() 方法2.3 delete() 方法2.4 entries() 方法2.5 forEach() 方法2.6 get() 方法2.7 getAll() 方法2.8 has() 方法2.9 keys() 方法2.10 set() 方法2.11 toString() 方法2.12 values() 方法 参考链接…

Protobuf序列化原理学习

Protobuf 序列化原理学习 1. 基本概念 消息&#xff1a;由于Protocp Buffer主要用于数据存储、网络通信的场景&#xff0c;将结构化的数据&#xff08;数据结构或对象&#xff09;进行序列化&#xff0c;生成二进制串来保存或传输。把要序列化的结构化数据称为**消息**。 T -…

Activiti学习之入门个人任务(07)

这里写目录标题 一、分配任务负责人1.1 固定分配1.2 表达式分配1.2.1 UEL表达式1.2.2 使用流程变量分配任务1.2.3 注意事项 1.3 监听器分配 二、查询任务2.1 查询负责人待办2.2 关联businessKey 三、办理任务 一、分配任务负责人 1.1 固定分配 在进行业务流程建模时指定固定的…

vdb:虚拟数据库

将文件虚拟成数据库&#xff0c;序列化写入、反序列化读取、直接读取。

离散型制造业中,MES系统的应用场景

在离散型制造业中&#xff0c;MES&#xff08;制造执行系统&#xff09;系统的应用场景极为丰富且关键&#xff0c;它贯穿于整个生产过程的各个环节&#xff0c;从生产计划到生产执行&#xff0c;再到质量控制和物料管理&#xff0c;都发挥着不可替代的作用。以下是离散制造业中…

本地化部署一个简单的AI大模型,Llama3.1

7 月 23 日消息&#xff0c;Meta 今晚正式发布llama3.1&#xff0c;提供 8B、70B 及 405B 参数版本。 Meta 称 4050 亿参数的 Llama 3.1-405B 在常识、可引导性、数学、工具使用和多语言翻译等一系列任务中&#xff0c;可与 GPT-4、GPT-4o、Claude 3.5 Sonnet 等领先的闭源模型…

收藏:高性价比https证书

在当今的数字化世界中&#xff0c;网络安全已经成为了每个网站所有者的首要关注点&#xff0c;为了保护网站的安全&#xff0c;防止数据被窃取或篡改&#xff0c;使用SSL证书已经成为了一种标准的做法&#xff0c;SSL证书是一种用于加密网站和用户之间数据传输的证书&#xff0…

[240726] Mistral AI 发布新一代旗舰模型 | Node.js 合并 TypeScript 文件执行提案

目录 Mistral AI 发布新一代旗舰模型&#xff1a;Mistral Large 2Node.js 合并 TypeScript 文件执行提案&#xff1a;--experimental-strip-types Mistral AI 发布新一代旗舰模型&#xff1a;Mistral Large 2 Mistral AI 宣布推出新一代旗舰模型 Mistral Large 2&#xff0c;该…

2024新版 黑马程序员《C++零基础入门》笔记——第一章19 cin中文乱码的解决

1.cin中文乱码的解决 2.代码实践 # include "iostream" # include "windows.h" using namespace std;int main() {SetConsoleOutputCP(CP_UTF8);string str;cin >> str;cout << str << endl;return 0; } 注意&#xff0c;勾选之后以后也…

【echarts】中如何设置曲线展示最新值、最大值、最小值

需要用到的属性&#xff1a;图表标注 series-line. markPoint 默认可以通过 type直接标注&#xff1a;‘min’ 最小值、‘max’ 最大值、‘average’ 平均值。 markPoint: {data: [{type: max},{type: min}]}如何展示最新值 如果要展示最新值得话&#xff0c;需要设置 标注…

如何让C++程序自动生成dump文件?以及如何分析dump文件?

目录 1、API函数SetUnhandledExceptionFilter介绍 2、调用SetUnhandledExceptionFilter设置异常处理函数 3、调用MiniDumpWriteDump函数导出包含异常上下文的dump文件 4、dump文件的多种生成方式 5、使用Windbg分析dump文件 6、最后 C++软件异常排查从入门到精通系列教程…

数业智能心大陆:定制你的专属心理健康方案

在快速变化的社会中&#xff0c;随着人们对自我健康认识的不断加深&#xff0c;心理健康已成为影响生活质量的关键因素&#xff0c;许多成年人在其一生中会遇到心理健康问题。在探索人类心理奥秘的旅程中&#xff0c;我们发现&#xff0c;每个人的心理状态和需求都是独一无二的…

mmdetection训练后评估指标,验证Loss

项目场景&#xff1a; 对mmdetection框架下训练好的log.json文件进行评估。 问题描述 使用框架底下自带的评估文件&#xff0c;不能对loss进行评估。也就是文件&#xff1a;tools/analysis_tools/analyze_logs.py 解决方案&#xff1a; 自己做了评估loss的代码&#xff0c;目…

使用nginx解决本地环境访问线上接口跨域问题

前言 前端项目开发过程中&#xff0c;经常会遇到各种各样的跨域问题。 虽然大部分时候&#xff0c;由脚手架自带的proxy功能即可解决问题&#xff0c;如webpack&#xff0c;vite等&#xff1b;但是若没有通过脚手架搭建项目&#xff0c;或者必须使用某些特殊规则转发时&#…

C语言常见字符函数和字符串函数精讲

目录 引言 一、字符函数 1.字符分类函数 2.字符转换函数 二、字符串函数 1.gets、puts 2.strlen 3.strcpy 4.strncpy 5.strcat 6.strncat 7.strcmp 8.strncmp 9.strstr 10.strchr 11.strtok 12.strlwr 13.strupr 引言 在C语言编程中&#xff0c;字符函数…

Python小工具——监听某网站的数据变化并进行邮件通知

目录 一、需求描述 二、解析 三、实例代码 一、需求描述 监听自考网2024年广东省6月份的毕业生学历注册进度&#xff0c;这是网址&#xff1a;https://www.chsi.com.cn/xlcx/count_zk.jsp&#xff0c; 如上图所示&#xff0c;我们想知道这个红色的空格啥时候被填满&#xf…

Linux下使用gdb进行调试入门级

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

linux modetest常用命令

1 通过help有哪些参数 130|:/ # modetest -h usage: modetest [-acDdefMPpsCvrw]Query options:-c list connectors-e list encoders-f list framebuffers-p list CRTCs and planes (pipes)Test options:-P <plane_id><crtc_id>:<w>x&l…