是否可以在运行时而不是编译时进行验证检查?

时间:2018-07-13 14:08:00

标签: java annotations annotation-processing checker-framework

使用以下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;}

}

是否可以在运行时间时通过注释 value检查构造函数自变量 @NonNull > 编译时间以外的其他?我个人仍然找不到任何 checker-framework ,它们可以在运行时进行验证检查。但是,是否可以实现注释处理器来进行运行时检查?

3 个答案:

答案 0 :(得分:1)

是的。 Lombok's @NonNull是运行时检查,仅插入带有引发的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();
  }
}

答案 1 :(得分:0)

您应该从javax.validation.constraints看@NotNull。 我在模型中使用了它,当我尝试使用空@NotNull值保存模型时,它抛出了Constraint异常。

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

如果您使用的是Spring和mongodb,则必须对其进行配置才能正常工作,我在Internet上的某个地方找到了一段代码(不记得在哪里),可以使用它:

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);
    }
}

答案 2 :(得分:0)

误解在你身后:对你的问题没有唯一的答案。

一些注释,当在这样的源代码上使用时,主要是 目标编译时间。就像一些静态分析工具一样,该工具会分析数据流以告诉您您在此处或此处违反了“带注释的”合同。

但是某些注释在运行时也会使用,例如与“ beans”一起使用。此类对象可能作为HTTP请求的参数进入,然后您需要一些框架来检查根据注释指定的规则,例如以JSON接收的内容是否有效。有关某些示例,请参见此tutorial