参数校验注解@NotNull、@NotBlank、@NotEmpty

本文介绍了Spring中的@NotNull、@NotBlank和@NotEmpty三个注解的使用及测试情况。@NotNull用于确保字段非null,@NotBlank则限制字符串不为空且不包含空白字符,@NotEmpty适用于字符串、集合和Map,确保它们不为空且有内容。测试代码展示了这些注解在不同场景下的验证效果,总结了它们的作用范围和效果。
摘要由CSDN通过智能技术生成

参数校验注解

简介

本文只对结论做说明,不深究过程

@NotNull 可以加在所有类型上,与@NotBlack或者 @NotEmpty配合有奇效
@NotBlank 只能用于字符串 用在其他类型上会报错
@NotEmpty 只用于字符串、集合、map,用于其他类型会报错
源码截图

探讨一下这三个注解加在字段上的作用
org.springmodules.validation.bean.conf.loader.annotation.handler
这三个注解都是来自于spring的注解
下面直接来验证

入参

public class TestSceneRequest {


    @NotNull
    private Integer id;

    @NotBlank
    private String name;


    @NotNull
    @NotBlank
    private String desc;


    @NotEmpty
    private List<String> list;

    @NotNull
    @NotEmpty
    private List<String> data;
 }

测试代码

测试代码如下,完整的测试通过使用的是junit测试
有一部分AOP代码没有贴出来,AOP代码作用注解生效后,如果参数不符合要求封装非法参数的返回值,设置result的success属性为false

@Test
    public void testNo(){
        TestSceneRequest request = new TestSceneRequest();
        // 测试@NutNull
        request.setName("erwe");
        request.setList(Arrays.asList("asd"));
        request.setData(Arrays.asList("asd"));
        request.setDesc("sadf");
        CommonResult result =  sceneConfigFacade.testNo(request);
        Assert.assertFalse(result.isSuccess());

        request.setId(0);
        result =  sceneConfigFacade.testNo(request);
        Assert.assertTrue(result.isSuccess());  // 使用NotNull后只要不是null就可以通过  

        request.setId(1);
        result =  sceneConfigFacade.testNo(request);
        Assert.assertTrue(result.isSuccess()); // 使用NotNull后只要不是null就可以通过  

        // 测试@NotBlack
        request.setName(null);
        result =  sceneConfigFacade.testNo(request);
        Assert.assertTrue(result.isSuccess());

        request.setName("   ");
        result =  sceneConfigFacade.testNo(request);
        Assert.assertTrue(result.isSuccess());

        request.setName("");
        result =  sceneConfigFacade.testNo(request);
        Assert.assertFalse(result.isSuccess());


        request.setName("dsf");
        result =  sceneConfigFacade.testNo(request);
        Assert.assertTrue(result.isSuccess());   // 单独使用NotBlack只要不是 “” 都可以检查通过

        // 测试@NotNull  @NotBlack 配合
        request.setDesc(null);
        result =  sceneConfigFacade.testNo(request);
        Assert.assertFalse(result.isSuccess());

        request.setDesc("   ");
        result =  sceneConfigFacade.testNo(request);
        Assert.assertTrue(result.isSuccess());

        request.setDesc("");
        result =  sceneConfigFacade.testNo(request);
        Assert.assertFalse(result.isSuccess());


        request.setDesc("dsf");
        result =  sceneConfigFacade.testNo(request);
        Assert.assertTrue(result.isSuccess()); // 使用@NotNull  @NotBlack 配合只要不是null 或 “” 其他都可以检查通过

        // 测试@NotEmpty 作用于集合
        request.setList(null);
        result =  sceneConfigFacade.testNo(request);
        Assert.assertTrue(result.isSuccess());

        request.setList(new ArrayList<>());
        result =  sceneConfigFacade.testNo(request);
        Assert.assertFalse(result.isSuccess());

        List<String> list = new ArrayList<>();
        list.add(null);
        request.setList(list);
        result =  sceneConfigFacade.testNo(request);
        Assert.assertTrue(result.isSuccess());

        request.setList(Arrays.asList(""));
        result =  sceneConfigFacade.testNo(request);
        Assert.assertTrue(result.isSuccess());


        request.setList(Arrays.asList("dfsd"));
        result =  sceneConfigFacade.testNo(request);
        Assert.assertTrue(result.isSuccess());  // 单独使用@NotEmpty 只要集合长度大于0,就可以通过,集合为null或者集合的元素为null的情况也不限制

        // 测试@NotNull @NotEmpty 配合作用于集合
        request.setData(null);
        result =  sceneConfigFacade.testNo(request);
        Assert.assertFalse(result.isSuccess());

        request.setData(new ArrayList<>());
        result =  sceneConfigFacade.testNo(request);
        Assert.assertFalse(result.isSuccess());

        request.setList(list);
        result =  sceneConfigFacade.testNo(request);
        Assert.assertFalse(result.isSuccess());

        // null在前
        list.add("");
        request.setList(list);
        result =  sceneConfigFacade.testNo(request);
        Assert.assertFalse(result.isSuccess());
        
        // null在后
        list.set(0, "");
        list.set(0, null);
        request.setList(list);
        result =  sceneConfigFacade.testNo(request);
        Assert.assertFalse(result.isSuccess());
        
        request.setData(Arrays.asList("dfsd"));
        result =  sceneConfigFacade.testNo(request);
        Assert.assertTrue(result.isSuccess());
        // 配合使用@NotNull @NotEmpty 集合本身为null、或者集合长度为0,或者集合的内部元素有空,都无法通过

    }

总结

注解使用范围作用
@NotNull使用在任何类型的字段字段不可以为null
@NotBlack只可以使用在String类型字段字段不可以为“”,可以为null
@NotEmpty只可以用在String、Collection、Map类型字段调用字段类型的isEmpty方法 对象不能是 null 并且相关对象的 size 大于 0
@NotNull与@NotBlack配合使用同@NotBlack字段不可以为null,也不可以为“”
@NotNull与@NotEmpty配合使用同@NotEmpty字段不可以为null,字段不可以为长度为0的集合,字段内集合内元素不可以为null

有问题留言
不定时回来看

@NotNull、@NotBlank和@NotEmpty是在Java中用于数据验证的注解。这些注解的作用是确保被注解的字段或参数不为null、不为空或不为空格。 @NotNull注解用于标记字段或参数不能为空。它适用于任何类型的字段,包括引用类型和基本类型。被@NotNull注解标记的字段或参数不能为null。 @NotBlank注解用于标记字符串字段或参数不能为空或为空格。它适用于字符串类型的字段或参数。被@NotBlank注解标记的字符串字段或参数不能为null,同时也不能只包含空格字符。 @NotEmpty注解用于标记集合类型的字段或参数不能为空或者长度不能为0。它适用于字符串、Collection、Map和数组类型的字段或参数。被@NotEmpty注解标记的集合字段或参数不能为null,并且长度不能为0(对于String、Collection和Map类型可以使用isEmpty()方法进行检查)。 这些注解可以在数据验证时起到很好的作用,帮助我们确保数据的完整性和准确性。在使用这些注解时,需要根据具体的需求选择合适的注解来进行标记和验证。同时还需要注意,被标记的字段或参数需要满足注解的要求,否则会触发相应的验证异常。 需要注意的是,@NotNull、@NotBlank和@NotEmpty注解并不会自动对字段或参数进行初始化。如果希望在声明字段的同时进行初始化,可以使用@RequiredArgsConstructor注解,它可以代替@Autowired注解,并且需要使用final关键字或@NotNull注解来标记成员变量。另外,如果类中存在final字段没有被初始化的情况,可以使用@NoArgsContructor(force=true)注解来为没有初始化的final字段设置默认值0/false/null。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Spring学习笔记-参考《Spring 实战第五版》(2021.9.9更新)](https://blog.csdn.net/qq_48302234/article/details/120017385)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值