【问题标题】:Is it possible to to do validation checking at run time other than compile time?是否可以在编译时以外的运行时进行验证检查?
【发布时间】:2018-07-13 14:07:59
【问题描述】:

使用以下 Java 代码:

public class Bean{
  private String value;
  public Bean(@NonNull String value) {
    //Usually fail-fast validation can be added here if it is needed
    this.value = value;
  }
  public String getValue() {return this.value;}

}

是否可以在运行时以外的运行时通过注解@NonNull检查构造函数参数value em>编译时间?就我个人而言,我仍然没有找到任何 checker-framework,它可以在 run time 进行验证检查。但是,是否可以实现一个注解处理器来进行运行时检查?

【问题讨论】:

  • 可以使用bean验证(Hibernate的实现很容易设置和使用)

标签: java annotations annotation-processing checker-framework


【解决方案1】:

是的。 Lombok's @NonNull 是一个运行时检查,它只是插入一个带有 throw 的 if 语句:

与龙目岛

import lombok.NonNull;

public class NonNullExample extends Something {
  private String name;

  public NonNullExample(@NonNull Person person) {
    super("Hello");
    this.name = person.getName();
  }
}

原版 Java

import lombok.NonNull;

public class NonNullExample extends Something {
  private String name;

  public NonNullExample(@NonNull Person person) {
    super("Hello");
    if (person == null) {
      throw new NullPointerException("person is marked @NonNull but is null");
    }
    this.name = person.getName();
  }
}

【讨论】:

    【解决方案2】:

    您应该看看 javax.validation.constraints 中的 @NotNull。 我在我的模型中使用它,当我尝试使用 null @NotNull 值保存模型时,它会抛出一个约束异常。

    导入是import javax.validation.constraints.NotNull;

    如果你使用的是Spring和mongodb,你必须配置它才能工作,我在互联网的某个地方找到了一段代码(不记得在哪里),你可以使用它:

    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.mongodb.core.mapping.event.ValidatingMongoEventListener;
    import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
    
    @Configuration
    public class CustomRepositoryRestConfigurerAdapter {
        @Bean
        public LocalValidatorFactoryBean localValidatorFactoryBean() {
            return new LocalValidatorFactoryBean();
        }
    
        @Bean
        public ValidatingMongoEventListener validatingMongoEventListener(
                @Qualifier("localValidatorFactoryBean") LocalValidatorFactoryBean lfb
        ) {
            return new ValidatingMongoEventListener(lfb);
        }
    }
    

    【讨论】:

      【解决方案3】:

      你的误解:你的问题没有单一的答案。

      一些注解在像这样的源代码上使用时主要针对编译时间。就像一些静态分析工具,它分析数据流,告诉你你在这里或那里违反了“带注释”的合同。

      但有些注解也“意在”在运行时使用,例如与“beans”一起使用。此类对象可能作为 HTTP 请求的参数出现,然后您有一些框架根据通过注释指定的规则检查以 JSON 形式接收的内容是否实际有效。有关示例,请参阅此tutorial

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-15
        • 1970-01-01
        • 2020-06-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多