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

news2024/11/15 18:44:25

文章目录

  • 一,引入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: always
    include-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://www.coloradmin.cn/o/1950155.html

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

相关文章

如何对视频文件加密_如何加密视频文件_视频文件如何加密

“嘿&#xff0c;小李&#xff0c;你知道咱们公司的新项目资料都是视频形式的吗&#xff1f;这些视频里有很多机密信息&#xff0c;我们需要好好保护起来。” “是啊&#xff0c;我也在想这个问题。你有没有什么好办法来加密这些视频文件呢&#xff1f;” “我听说有个叫域智盾…

html+css前端作业 王者荣耀官网1个页面(带报告)

htmlcss前端作业 王者荣耀官网1个页面&#xff08;带报告&#xff09; 下载地址 https://download.csdn.net/download/qq_42431718/89575045 目录1 目录2 项目视频 王者荣耀首页1个页面&#xff08;无js&#xff09; 页面1

推荐|政务网站部署哪种SSL证书?如何申请?

政务网站作为面向公众提供政务服务的官方平台&#xff0c;对信息安全和公信力有极高的要求。因此&#xff0c;在部署SSL证书时&#xff0c;应慎重选择。下面是关于政务网站SSL证书选择的一些建议&#xff1a; 一、推荐的SSL证书类型 1 选择数据不出境&#xff0c;国内验签的证…

多模态论文一:CLIP模型主要内容讲解【原理+代码】

一、CLIP模型主要内容讲解 CLIP&#xff08;Contrastive Language-Image Pre-training&#xff09;是OpenAI在2021年发布的一种用于图像和文本联合表示学习的模型。CLIP的核心思想是通过对比学习来预训练一个模型&#xff0c;使其能够理解图像和文本之间的关系。以下是CLIP的工…

Ruoyi-WMS本地运行

所需软件 1、JDK&#xff1a;8 安装包&#xff1a;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.htmlopen in new window 安装文档&#xff1a;https://cloud.tencent.com/developer/article/1698454open in new window 2、Redis 3.0 安装包&a…

【STM32 FreeRTOS】FreeRTOS的移植

其实这篇文章不侧重移植&#xff0c;因为我们会使用CubeMX配置&#xff0c;那样会自动移植FreeRTOS。 关于FreeRTOS&#xff0c;可以参考官网&#xff1a;FreeRTOS - Quick start guide 当我们在CubeMX中配置了CMSIS_V2后尝试编译的时候会有一个弹窗。 第一个问题就是强烈建议…

ubuntu实践

目录 扩容 本机上ping不通新建立的虚拟机 ssh连接 装sshd ssh客户端版本较低&#xff0c;会报key exchange算法不匹配问题 ubuntun上装docker 将centos7下的安装包改造成适配 ubuntu的包 参考文章 扩容 Hyper-V 管理器安装的ubutun扩容磁盘空间说明_hype-v磁盘扩容-…

私域电商丨软件系统开发中,一定要避开的几个坑,看懂少很多弯路

文丨微三云胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 大家好&#xff0c;我是软件开发胡佳东&#xff0c;每天为大家分享互联网资讯干货&#xff01; 在数字化时代的今天&#xff0c;软件开发是已经成为推动科技进步和商业发展的重要…

【软件推荐】“聊崽”聊天机器人

不是广告&#xff01;不是广告&#xff01;不是广告&#xff01; 自己小团队开发的产品&#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 等领先的闭源模型…

python-绝对值排序(赛氪OJ)

[题目描述] 输入 n 个整数&#xff0c;按照绝对值从大到小排序后输出。保证所有整数的绝对值不同。输入格式&#xff1a; 输入数据有多组&#xff0c;每组占一行&#xff0c;每行的第一个数字为 n ,接着是 n 个整数&#xff0c; n0 表示输入数据的结束&#xff0c;不做处理。输…

实现领域驱动设计(DDD)系列详解:领域模型的持久化

领域驱动设计主要通过限界上下文应对复杂度&#xff0c;它是绑定业务架构、应用架构和数据架构的关键架构单元。设计由领域而非数据驱动&#xff0c;且为了保证定义了领域模型的应用架构和定义了数据模型的数据架构的变化方向相同&#xff0c;就应该在领域建模阶段率先定义领域…

【MSP430】DriverLib库函数,GPIO相关函数介绍

采用了DriverLib库函数&#xff0c;以下是对GPIO相关函数的介绍 MSP430F5xx_6xx_DriverLib_Users_Guide-2_91_13_01(函数库手册).pdf 在MSP430单片机中&#xff0c;GPIO相关的函数提供了一套完整的接口用于配置和控制GPIO引脚。这些函数可以方便地管理引脚的输入输出模式、电平…

【微信小程序实战教程】之微信小程序 WXS 语法详解

WXS语法 WXS是微信小程序的一套脚本语言&#xff0c;其特性包括&#xff1a;模块、变量、注释、运算符、语句、数据类型、基础类库等。在本章我们主要介绍WXS语言的特性与基本用法&#xff0c;以及 WXS 与 JavaScript 之间的不同之处。 1 WXS介绍 在微信小程序中&#xff0c…

利用换元法计算积分的常见题型(考研高数复习)

考研中常见的几种换元法积分计算题 (1)被积式仅包含一个根式&#xff1a;根号下为有 a a a 和 x x x 的平方和/平方差 此种类型的积分题型&#xff0c;可以通过构造单个锐角大小为 t t t 的直角三角形&#xff0c;利用勾股定理和三角函数进行代换。 平方和的情况 形如 ∫…

40V/4.5A的AH6240直接替代PT2470的直流有刷电机驱动芯片

135-3806-7573本文将详细介绍AH6240直流有刷电机驱动芯片如何直接替代PT2470&#xff0c;并探讨其在实际应用中的优势。 一、AH6240与PT2470的对比分析 AH6240是一款高性能的直流有刷电机驱动芯片&#xff0c;具有40V/4.5A的输出能力&#xff0c;支持宽电压范围输入&#xff0…

【Android】Activity生命周期与四种启动模式

文章目录 生命周期返回栈Activity状态生命周期方法 启动模式standard模式singleTask模式singleTop模式singleInstance模式配置方式 生命周期 返回栈 每个Activity的状态由它在Activity栈&#xff08;又叫“回退栈back stack”&#xff09;中的位置决定&#xff0c;是所有当前…

scratch笔记

一、图章 练习题&#xff1a; 【画笔】 一、选择题 1.怎样修改图章的颜色&#xff1f;&#xff08;D &#xff09; A. 只需要一个数字来设置颜色 B. 设置RGB的值 C. 在画笔中设置颜色、饱和度、亮度 D. 在外观中设置或修改角色颜色特效 2.执行下面程序&#xff0c;最后可能出…

idea中如何创建yml、yaml、properties配置文件

目录 1、配置文件 2、创建yml配置文件 3、配置文件的优先级 1、配置文件 我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置&#xff0c;那其实呢&#xff0c;在springboot项目当中是支持多种配置方式的&#xff0c;除了支持properties配置文件…

视频加密软件哪个好?怎么进行视频文件加密?

员工A&#xff1a;“最近公司有很多重要视频资料需要保存和分享&#xff0c;但担心安全问题&#xff0c;你有什么好推荐吗&#xff1f;” 员工B&#xff1a;“当然有&#xff0c;市面上有很多视频加密软件&#xff0c;其中我觉得域智盾非常不错。它是一款功能强大的企业文件加…