谷粒商城实战笔记-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模块中。

		<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;
  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小手追梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值