@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