【问题标题】:Javax @NotNull annotation usageJavax @NotNull 注解用法
【发布时间】:2017-09-26 00:30:04
【问题描述】:

我有一个简单的方法来获取给定companyId 的文档列表。方法如下:

@Override
public List<Documents> getDocumentList(@NotNull Integer companyId) {
    Company company = new Company(companyId);
    return this.documentRepository.findByCompany(company);
}

我想使用 Javax 验证约束来确保传入的 companyId 不是 null。但它似乎没有任何效果,因为我可以传入一个 null 值,它会向下传递到存储库上的 findByCompany 调用。我还在@NotNull 之前添加了@Valid 以强制验证,但这也没有做任何事情。

我总是可以写几行代码来检查null 的值,但我想使用javax.validation 注释来使代码更具可读性和简洁性。有没有办法让注释在方法参数上起作用?

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    要激活参数验证,只需使用 @Validated 注释类

    import org.springframework.validation.annotation.Validated;
    

    【讨论】:

    • 如果我不使用弹簧会怎样
    • 你可以使用来自 projectlombok (lombok.NonNull) 的@NonNull
    • 添加更多的注解会对性能有影响吗?在调用实际方法之前再添加一层?
    • @Validated 的影响可以忽略不计
    【解决方案2】:

    如果您使用您的方法@Inject 一个类,它会按预期工作。

    @Stateless
    public class MyBean{ 
        @Inject
        TestClass test;
    }
    

    public class TestClass {
        public List<Documents> getDocumentList(@NotNull Integer companyId)
        {
            //...
        }
    }
    

    ConstraintViolationException 当你用空参数调用你的方法时:

    WFLYEJB0034: EJB Invocation failed on component MyBean for method ...:
    javax.ejb.EJBException: javax.validation.ConstraintViolationException:
    1 constraint violation(s) occurred during method validation.
    

    【讨论】:

      【解决方案3】:

      @NotNull 注解,

      1. 方法不应返回 null。
      2. 变量(如字段、局部变量和参数)不能保存空值。

      【讨论】:

      • 投反对票,因为提供一些不适合该问题的一般编程提示对任何人都没有帮助。此外,您的第二个陈述令人困惑/不完整(如果按照书面的意思表示是错误的)。
      【解决方案4】:

      来自 Java EE 6 教程:

      Bean Validation 模型由以下形式的约束支持 放置在 JavaBeans 的字段、方法或类上的注释 组件例如托管 bean

      您应该将验证与声明的 bean 相关的字段放在一起,如下所示:

      @Entity
      @Table(name="users")
      public class BackgammonUser {
      
          @Id
          @GeneratedValue(strategy=GenerationType.IDENTITY)
          private Long userId;
      
          @Column(name="username")
          @NotBlank
          private String userName;
      
          @NotBlank
          private String password;
      
          @NotNull
          private Boolean enabled;
      }
      

      BackgammonUser 被认为是一个 bean。

      【讨论】:

      • 我知道这一点。我不想为单个参数创建一个 bean
      • 那么这是一个限制。您也可以在 Java EE 6 教程中查找它
      • 谢谢。我想,毕竟我必须手动编写空检查:)
      • 我们可以在Entity类上使用@NotNull注解,而不是检查每个变量吗??
      猜你喜欢
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 2014-08-21
      • 2016-03-09
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多