关于@NotNull注解失效的原因之一
作者:我是时生
这篇文章主要介绍了关于@NotNull注解失效的原因之一,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
@NotNull注解失效原因之一
给String类型加上@NotNull注解时,只有传入的参数为空时才会报异常,当传入的为空字符串时并不会报异常,就会出现报异常的现象
传参为空指的是该参数就没有传,为空字符串指的是有该参数但是是双引号""
Lombok判断注解怎么使用,
梳理下来为
@NotEmpty用在集合类上@NotBlank用在String上@NotNull用在基本类型上
最后最重要的是,在接口参数前加注解’@Validated’
@Valid注解是什么
@Valid
用于验证注解是否符合要求,直接加在变量user之前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回message 的错误提示信息。
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping
public User create (@Valid @RequestBody User user) {
System.out.println(user.getId());
System.out.println(user.getUsername());
System.out.println(user.getPassword());
user.setId("1");
return user;
}
} 然后在 User 类中添加验证信息的要求:
public class User {
private String id;
@NotBlank(message = "密码不能为空")
private String password;
}@NotBlank 注解所指的 password 字段,表示验证密码不能为空,如果为空的话,上面 Controller 中的 create 方法会将message 中的"密码不能为空"返回。
当然也可以添加其他验证信息的要求:
| 限制 | 说明 |
|---|---|
| @Null | 限制只能为null |
| @NotNull | 限制必须不为null |
| @AssertFalse | 限制必须为false |
| @AssertTrue | 限制必须为true |
| @DecimalMax(value) | 限制必须为一个不大于指定值的数字 |
| @DecimalMin(value) | 限制必须为一个不小于指定值的数字 |
| @Digits(integer,fraction) | 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction |
| @Future | 限制必须是一个将来的日期 |
| @Max(value) | 限制必须为一个不大于指定值的数字 |
| @Min(value) | 限制必须为一个不小于指定值的数字 |
| @Past | 限制必须是一个过去的日期 |
| @Pattern(value) | 限制必须符合指定的正则表达式 |
| @Size(max,min) | 限制字符长度必须在min到max之间 |
| @Past | 验证注解的元素值(日期类型)比当前时间早 |
| @NotEmpty | 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0) |
| @NotBlank | 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格 |
| 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式 |
除此之外还可以自定义验证信息的要求,例如下面的 @MyConstraint:
public class User {
private String id;
@MyConstraint(message = "这是一个测试")
private String username;
}注解的具体内容:
@Constraint(validatedBy = {MyConstraintValidator.class})
@Target({ELementtype.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyConstraint {
String message();
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}下面是校验器:
public class MyConstraintValidator implements ConstraintValidator<MyConstraint, Object> {
@Autowired
private UserService userService;
@Override
public void initialie(@MyConstraint constarintAnnotation) {
System.out.println("my validator init");
}
@Override
public boolean isValid(Object value, ConstraintValidatorContext context) {
userService.getUserByUsername("seina");
System.out.println("valid");
return false;
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
