自学内容网 自学内容网

第五章 Spring Boot快速⼊⻔ —— JSR303数据校验

前言:

        项目中通常我们在编写接口时,对于部分接口的参数我们要进行判空或者格式校验来避免程序出现异常。一般都是使用if-else逐个对参数进行校验,多个参数需要校验,可能就需要写很多if-else,那这种方式代码上可读性以及美观程序相对较差。那么我们就可以使用@Validated注解来帮助我们优雅的校验参数。

一:@Validated

            @Validated 参数校验原理在Spring框架中是一个关键的数据验证机制,它确保了数据在进入业务逻辑之前满足一定的约束条件。基于Spring的MethodValidationInterceptor实现,并通过ValidatedAnnotationBeanPostProcessor处理方法级别的验证。这个注解通常被放置在控制器(Controller)的方法参数上,用于对传入的参数进行校验。

1.先看个使用效果

 a.代码如下【java】

@RestController
@RequestMapping("/test")
public class TestUserController {


    @PostMapping("/save")
    public String save(@Validated @RequestBody UserBo userBo) {
        return "";
    }
}


@Data
class UserBo{
    @NotNull(message = "主键id不能为空")
    private Long id;

    @NotBlank(message = "密码不能为空")
    @Length(min = 6, max = 16, message = "密码长度为6-16位")
    private String password;
}

b.演示结果

c.控制台

在处理业务代码之前进行参数校验,可以避免在业务逻辑中插入大量的校验代码,从而减少代码冗余,使代码更加简洁和易于维护。

2.原理过程:

  • 当Spring MVC接收到一个请求并准备调用相应的控制器方法时,它会首先解析方法参数上的@Validated注解。
  • 根据@Validated注解的配置(如分组校验),Spring会选择相应的验证器(Validator)来进行校验。默认情况下,Spring会使用LocalValidatorFactoryBean作为验证器。
  • 验证器会根据@Validated注解所标注的参数上的其他校验注解(如@NotNull、@Size等)来应用相应的校验规则。
  • 如果校验通过,则继续执行控制器方法的业务逻辑。如果校验失败,则Spring会抛出一个MethodArgumentNotValidException异常,并返回一个400(Bad Request)状态码。在实际项目中,通常会通过全局异常处理来捕获这个异常,并返回一个更友好的错误提示。

3.优点:

  • 减少代码冗余

        在业务代码之前进行参数校验,可以避免在业务逻辑中插入大量的校验代码,从而减少代码冗余,使代码更加简洁和易于维护。

  • 提升代码可读性

使用注解进行参数校验,可以使校验规则更加直观和易于理解。开发者可以通过查看实体类字段上的注解,快速了解该字段的校验规则。

  • 提供友好的用户反馈

参数校验可以帮助开发者捕获用户输入的错误,并向用户提供友好的错误提示。通过及时地反馈错误信息,用户可以更快地发现和纠正输入错误,提升用户体验。

 二:常用注解

空值校验:

  • @Null:被注释的元素必须为null。
  • @NotNull:被注释的元素必须不为null。

布尔值校验

  • @AssertTrue:被注释的元素必须为true。
  • @AssertFalse:被注释的元素必须为false。

数值校验:

  • @Min(value):被注释的元素必须是一个数字,其值必须大于等于指定的最小值。

  • @Max(value):被注释的元素必须是一个数字,其值必须小于等于指定的最大值。

  • @DecimalMin(value):被注释的元素必须是一个数字,其值必须大于等于指定的最小值(支持小数点)。

  • @DecimalMax(value):被注释的元素必须是一个数字,其值必须小于等于指定的最大值(支持小数点)。

  • @Digits(integer, fraction):被注释的元素必须是一个数字,其值必须在可接受的范围内,其中integer表示整数部分的位数,fraction表示小数部分的位数。

  • @Range:被注释的元素必须在合适的范围内(包含@Min和@Max的功能)。

字符串校验 :

  • @Size(max, min):被注释的元素的大小必须在指定的范围内。
  • @Length:被注释的字符串的大小必须在指定的范围内(与@Size类似,但专门用于字符串)。
  • @NotEmpty:被注释的字符串的必须非空。
  • @NotBlank:验证字符串非null,且长度必须大于0(通常用于字符串,要求字符串既非null也非空字符串"")。
  • @Pattern(value):被注释的元素必须符合指定的正则表达式。
  • @Email:被注释的元素必须是电子邮箱地址。

日期校验:                   

  • @Past:被注释的元素必须是一个过去的日期。
  • @Future:被注释的元素必须是一个将来的日期。

分组校验:

  • @Validated注解的groups属性允许根据不同的场景自定义验证规则。要使用分组校验,首先需要定义校验组接口,然后在@Validated注解中指定要应用的校验组。

嵌套校验:

  • 对于嵌套的对象,可以使用@Valid注解进行递归校验。注意,@Valid@Validated在嵌套校验中的使用有所不同,@Valid主要用于成员属性(字段)上的嵌套校验,而@Validated则主要用于方法参数和请求体的校验。

以上注解在使用时通常与@Validated@Valid注解结合使用,以指定哪些字段或参数需要进行校验。在Spring Boot中,这些注解通常与控制器方法参数或请求体一起使用,以确保在数据进入业务逻辑之前进行充分的校验。 

三:进一步代码演示

1.数值校验(@Min @Max)

a.代码示例【java】:

例如:年龄不能小于1,不能大于120

@RestController
@RequestMapping("/test")
public class TestUserController {

    @PostMapping("/save")
    public String save(@Validated @RequestBody UserBo userBo) {
        return userBo.toString();
    }
}


@Data
class UserBo{
    @NotNull(message = "主键id不能为空")
    private Long id;

    @NotNull(message = "用户年龄不能为空")
    @Min(value = 1, message = "用户年龄不能小于1")
    @Max(value = 120, message = "用户年龄不能大于120")
    private Integer age;

}

b.演示结果:

2. 字符串校验(@Pattern

a.代码示例【java】:

例如:手机号格式

@RestController
@RequestMapping("/test")
public class TestUserController {


    @PostMapping("/save")
    public String save(@Validated @RequestBody UserBo userBo) {
        return userBo.toString();
    }
}


@Data
class UserBo{
    @NotNull(message = "主键id不能为空")
    private Long id;

    @NotBlank(message = "手机号码不能为空")
    @Pattern(regexp = "0?(13|14|15|17|18|19)[0-9]{9}", message = "手机号格式不正确")
    private String phone;

}

b.演示结果:

 

3.嵌套校验(@Valid)

a.代码示例【java】

@RestController
@RequestMapping("/test")
public class TestUserController {


    @PostMapping("/save")
    public String save(@Validated @RequestBody UserBo userBo) {
        return userBo.toString();
    }
}


@Data
class UserBo{
    @NotNull(message = "主键id不能为空")
    private Long id;

    @Valid
    private OrderBo orderBo;
}

@Data
class OrderBo{
    @NotNull(message = "订单id不能为空")
    private Long id;

    @NotBlank(message = "订单名称")
    private String name;
}

b.演示结果:

小结:

        本章节校验注解提供了一种简洁而强大的方式来确保输入数据的合法性,允许开发者在实体类的字段上直接声明约束条件,非常方便。


原文地址:https://blog.csdn.net/Qzhangww/article/details/143953878

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!