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

文章目录

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

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

一,引入JSR 303依赖

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

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

clike 复制代码
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <version>2.3.2.RELEASE</version>
        </dependency>

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

clike 复制代码
server:
  error: #303校验错误信息提示
    include-binding-errors: always
    include-message: always

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

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

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

三,给字段添加校验注解

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

  • @NotBlank: 标注在品牌名字段上,表示该字段必须包含至少一个非空字符。
java 复制代码
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 类型。

示例用法:

java 复制代码
@NotBlank(message = "品牌名必须提交")
private String name;

@NotNull

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

示例用法:

java 复制代码
@NotNull(message = "Logo必须提交")
private String logo;

比较

  • 适用范围:

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

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

四,BindingResult获取校验结果

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

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

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

java 复制代码
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属性自定义错误提示。

java 复制代码
@NotNull(message = "Logo必须提交")
private String logo;

六,其他校验规则

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

  • Logo URL :
    • @NotNull & @URL: 标注在Logo字段上,表示该字段必须不为空且是一个有效的URL。
java 复制代码
@NotNull(message = "Logo必须提交")
@URL(message = "Logo必须是一个合法的URL地址")
private String logo;
  • First Letter :
    • @Pattern: 标注在首字母字段上,表示该字段必须满足特定的正则表达式。
java 复制代码
@Pattern(regexp = "^[a-zA-Z]$",
         message = "检索首字母必须是一个字母")
private String firstLetter;
  • Sort :
    • @Min: 标注在排序字段上,表示该字段必须大于等于0。
java 复制代码
@Min(value = 0, message = "排序必须大于等于0")
private Integer sort;
相关推荐
CCSBRIDGE11 分钟前
Magento2项目部署笔记
笔记
亦枫Leonlew1 小时前
微积分复习笔记 Calculus Volume 2 - 5.1 Sequences
笔记·数学·微积分
爱码小白1 小时前
网络编程(王铭东老师)笔记
服务器·网络·笔记
LuH11242 小时前
【论文阅读笔记】Learning to sample
论文阅读·笔记·图形渲染·点云
一棵开花的树,枝芽无限靠近你3 小时前
【PPTist】组件结构设计、主题切换
前端·笔记·学习·编辑器
犬余4 小时前
设计模式之桥接模式:抽象与实现之间的分离艺术
笔记·学习·设计模式·桥接模式
数据爬坡ing5 小时前
小白考研历程:跌跌撞撞,起起伏伏,五个月备战历程!!!
大数据·笔记·考研·数据分析
咖肥猫5 小时前
【ue5学习笔记2】在场景放入一个物体的蓝图输入事件无效?
笔记·学习·ue5
郭尘帅6666 小时前
Ajax学习笔记
笔记·学习·ajax
我叫啥都行6 小时前
计算机基础复习12.23
java·开发语言·笔记·后端·学习