JSR303(@Null、@NotNull、@NotEmpty等)注解中groups的作用

JSR303注解分组校验实战解析
本文介绍了JSR303在Java中的使用,特别是在实体类校验中的分组校验功能。通过案例展示了如何在不同接口中使用@NotNull等注解的groups属性,实现对特定字段的按需校验。例如,登录接口校验用户名和密码,其他接口校验key。控制层需添加@Validated注解,并指定校验分组,以实现灵活的验证逻辑。

案例

同一个实体类,在登陆接口的时候我们需要校验用户名和密码,但是其他接口我们不需要校验用户名和密码,反而需要校验key,此时就可以使用groups 。

注意事项

  1. 控制层 记得加上 @Validated 注解
  2. groups里面的参数是接口而不是类 如果是类会报如下错误
    在这里插入图片描述
    3.如果实体类没有加上分组参数 控制层里加上了分组参数,那么是不会对他进行校验的。

准备 实体类 接口 控制层

//  实体类
@Data
public class Test {
    @NotNull(message = "用户名不能为空",groups = {TestInterface.class})
    private String username;
    @NotNull(message = "密码不能为空",groups = {TestInterface.class,TestInterface2.class})
    private String password;
    @NotNull(message = "key不能为空")
    private String key;
}
	// 2个接口  因为 注解里面的groups 是一个数组 可以写多个

// 第一个
public interface TestInterface1 {
}
// 第二个
public interface TestInterface2 {
}

//控制层
@RestController
public class TestController {
    @PostMapping("test1")
    public void  test2(@Validated() @RequestBody Test test){
        System.out.println(test);
    }

    @PostMapping("test2")
    public void  test1(@Validated(value = {TestInterface1.class}) @RequestBody Test test){
        System.out.println(test);
    }

    @PostMapping("test3")
    public void  test4(@Validated(value = {TestInterface2.class}) @RequestBody Test test){
        System.out.println(test);
    }

    @PostMapping("test4")
    public void  test3(@Validated(value = {TestInterface1.class,TestInterface2.class})@RequestBody Test test){
        System.out.println(test);
    }
}

访问接口及结果

4个接口统一携带的参数

{
    "username": null,
    "password": null,
    "key": null
}

此项目加上了全局异常处理 所以返回的报错信息不是原来的

test1接口

在这里插入图片描述
只会校验 key字段 因为 实体类和controller都没有在注解里面加上分组参数。当然此时key不传入null,这个接口是不会报错的。

test2接口

在这里插入图片描述
校验了用户名和密码,实体类和controller都有在注解里面加上分组参数。注:此时根本不会校验key。

test3接口

在这里插入图片描述
校验了密码,实体类和controller都有在注解里面加上分组参数。注:此时根本不会校验key和用户名

test4接口

在这里插入图片描述
校验了用户名和密码,实体类和controller都有在注解里面加上分组参数。注:此时根本不会校验key。

Java 中,`@NotNull` 注解通常用于确保某个字段、方法参数或返回值不能为 `null`。该注解属于 Bean Validation(JSR 380)规范的一部分,最常用的实现是 Hibernate Validator。通过使用 `@NotNull`,可以有效地防止空值进入系统,从而提升程序的健壮性。 `@NotNull` 注解的基本使用方式如下: ```java import javax.validation.constraints.NotNull; public class User { @NotNull(message = "用户名不能为空") private String username; // Getter and Setter public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } } ``` 在 Spring 框架中,特别是在控制器层(Controller),`@NotNull` 常与 `@Valid` 一起使用来验证请求体中的数据是否符合预期。例如: ```java import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; @RestController public class UserController { @PostMapping("/users") public String createUser(@Valid @RequestBody User user) { return "用户创建成功: " + user.getUsername(); } } ``` 如果请求中 `username` 字段为 `null`,则会触发验证异常,并返回相应的错误信息。 除了 `@NotNull`,Java 中还有其他常用的数据校验注解,例如: - `@NotEmpty`:用于集合、数组、字符串等,确保其不为空(即长度或大小大于 0)。 - `@NotBlank`:仅用于字符串,确保其不仅不为 `null`,而且去除空格后也不为空。 - `@Pattern`:用于匹配字段值是否符合指定的正则表达式。 这些注解通常与 Hibernate Validator 一起使用。Hibernate Validator 是一个广泛使用的 Bean Validation 实现库,它提供了丰富的约束注解和灵活的验证机制。要使用这些注解,需要在项目中引入以下依赖(以 Maven 为例): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> ``` 在实际开发中,`@NotNull` 注解可以结合分组校验(Group Validation)进行更精细的控制。例如,可以在不同的业务场景下应用不同的验证规则: ```java public interface GroupInterface1 {} public interface GroupInterface2 {} public class User { @NotNull(groups = {GroupInterface1.class, GroupInterface2.class}, message = "用户名不能为空") private String username; // Getter and Setter } ``` 通过这种方式,可以在调用验证时指定使用哪个分组进行校验,从而实现更灵活的数据验证逻辑。 此外,`@NotNull` 注解也可以与 `@Validated` 一起使用,以便在 Spring 的服务层(Service Layer)中进行方法级别的参数校验[^2]。 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值