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

时间:2019-03-07 15:10:59

标签: java spring spring-boot

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

@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;

现在,如果我发出一个简单的帖子请求(我将高级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允许Nulls?

3 个答案:

答案 0 :(得分:2)

JSR-303验证API中没有@NonNull批注。该注释称为@NotNull。确保您实际上使用了javax.validation.constraints.NotNull批注来标记该字段。

答案 1 :(得分:2)

您应该从javax.validation包而不是lombok使用NotNull(当Java开始支持验证时,这些将被删除-请参见here)。它验证了豆。更多信息here。您还可以从org.hibernate.validator使用hibernate的@NotNull。这也可以验证。

答案 2 :(得分:1)

  

javax.validation.constraints


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

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

  • CharSequence(评估字符序列的长度)
  • 集合(评估集合大小)
  • 地图(评估地图大小)
  • 数组(评估数组长度)

@NotBlank:带注释的元素不能为null,并且必须至少包含一个非空格字符。接受CharSequence


@NonNull refer to Lombok

您可能会喜欢Click Here