简介
本文只对结论做说明,不深究过程
@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 |
有问题留言
不定时回来看