@NonNull 注释允许在验证中使用空值
@NonNull annotation allows null values in validation
我的控制器中有以下方法:
@PostMapping("/register")
public String registerNewUser(@Valid User user, BindingResult result, Model model, RedirectAttributes redirectAttributes) {
System.out.println(result);
System.out.println(user);
if(result.hasErrors()) {
System.out.println("***ERROR***");
System.out.println(result.getAllErrors());
return result.getAllErrors().toString();
} else {
//userRepository.save(user);
System.out.println("user saved!");
return "user saved!";
}
}
我的用户实体指定:
@NonNull
@Column(nullable = false, unique = true)
@Valid
public String alias;
现在,如果我发出一个简单的 post 请求(我将高级 REST 客户端用于 chrome 扩展),我得到:
org.springframework.validation.BeanPropertyBindingResult: 0 errors
User(id=null, email=null, password=null, enabled=false, firstName=null, lastName=null, fullName=null null, alias=null, roles=[], links=[])
user saved!
尽管@NonNull 别名为 null,它似乎仍然有效。
如果我将@NonNull 更改为@NotEmpty
然后验证按预期工作:
[Field error in object 'user' on field 'alias': rejected value [null]; codes [NotEmpty.user.alias,NotEmpty.alias,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.alias,alias]; arguments []; default message [alias]]; default message [must not be empty]]
但我不明白的是为什么@NonNull 允许空值?
JSR-303 验证 API 中没有 @NonNull
注释。注释称为 @NotNull
。确保您实际使用 javax.validation.constraints.NotNull
注释来标记该字段。
您应该使用 javax.validation 包中的 NotNull
,而不是 lombok 中的 NotNull
(当 java 开始支持验证时,这些将被删除 - 请参阅 here). It validates the beans. More info here。您可以还使用来自 org.hibernate.validator 的休眠 @NotNull
。这也进行验证。
javax.validation.constraints
@NotNull:
被注解的元素不能是null.Accepts任何类型
@NotEmpty:
注释元素不能为 null 也不能为空。支持的类型有:
- CharSequence(评估字符序列的长度)
- Collection(collection尺寸评估)
- 地图(评估地图大小)
- 数组(计算数组长度)
@NotBlank:
带注释的元素不能为空,并且必须至少包含一个 non-whitespace 字符。接受 CharSequence
@NonNull refer to Lombok
以下是您可能喜欢的重要细节Click Here
我的控制器中有以下方法:
@PostMapping("/register")
public String registerNewUser(@Valid User user, BindingResult result, Model model, RedirectAttributes redirectAttributes) {
System.out.println(result);
System.out.println(user);
if(result.hasErrors()) {
System.out.println("***ERROR***");
System.out.println(result.getAllErrors());
return result.getAllErrors().toString();
} else {
//userRepository.save(user);
System.out.println("user saved!");
return "user saved!";
}
}
我的用户实体指定:
@NonNull
@Column(nullable = false, unique = true)
@Valid
public String alias;
现在,如果我发出一个简单的 post 请求(我将高级 REST 客户端用于 chrome 扩展),我得到:
org.springframework.validation.BeanPropertyBindingResult: 0 errors
User(id=null, email=null, password=null, enabled=false, firstName=null, lastName=null, fullName=null null, alias=null, roles=[], links=[])
user saved!
尽管@NonNull 别名为 null,它似乎仍然有效。
如果我将@NonNull 更改为@NotEmpty
然后验证按预期工作:
[Field error in object 'user' on field 'alias': rejected value [null]; codes [NotEmpty.user.alias,NotEmpty.alias,NotEmpty.java.lang.String,NotEmpty]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.alias,alias]; arguments []; default message [alias]]; default message [must not be empty]]
但我不明白的是为什么@NonNull 允许空值?
JSR-303 验证 API 中没有 @NonNull
注释。注释称为 @NotNull
。确保您实际使用 javax.validation.constraints.NotNull
注释来标记该字段。
您应该使用 javax.validation 包中的 NotNull
,而不是 lombok 中的 NotNull
(当 java 开始支持验证时,这些将被删除 - 请参阅 here). It validates the beans. More info here。您可以还使用来自 org.hibernate.validator 的休眠 @NotNull
。这也进行验证。
javax.validation.constraints
@NotNull:
被注解的元素不能是null.Accepts任何类型
@NotEmpty:
注释元素不能为 null 也不能为空。支持的类型有:
- CharSequence(评估字符序列的长度)
- Collection(collection尺寸评估)
- 地图(评估地图大小)
- 数组(计算数组长度)
@NotBlank:
带注释的元素不能为空,并且必须至少包含一个 non-whitespace 字符。接受 CharSequence
@NonNull refer to Lombok
以下是您可能喜欢的重要细节Click Here