Java @非空批注允许在验证中使用空值

Java @非空批注允许在验证中使用空值,java,spring,hibernate,spring-boot,lombok,Java,Spring,Hibernate,Spring Boot,Lombok,我的控制器中有以下方法: @PostMapping("/register") public String registerNewUser(@Valid User user, BindingResult result, Model model, RedirectAttributes redirectAttributes) { System.out.println(result); System.out.println(user); if(re

我的控制器中有以下方法:

@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扩展),我会得到:

尽管@NonNull alias为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包而不是从lombok使用
NotNull
(当java开始支持验证时,这些将被删除-请参阅)。它验证bean。更多信息。您还可以从org.hibernate.validator使用hibernate的
@NotNull
。这也会进行验证

javax.validation.constraints


@NotNull:
带注释的元素不能为null。接受任何类型

@NotEmpty:
带注释的元素不能为null或空。支持的类型包括:

  • CharSequence(计算字符序列的长度)
  • 集合(计算集合大小)
  • 地图(评估地图大小)
  • 数组(计算数组长度)
@NotBlank:
带注释的元素不能为null,并且必须至少包含一个非空白字符。接受字符序列



以下是您可能喜欢的详细信息

您从哪个包获得了
NotNull
?Lombok项目导入应该来自javax.validation包,我想。啊,好的,我明白了,这是有意义的。所以,如果我想同时使用这两个,我应该使用完整的包名作为一个?
[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 refer to Lombok