0

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

4

3 回答 3

1

是的。Lombok@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();
  }
}

香草爪哇

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();
  }
}
于 2018-07-13T14:15:40.367 回答
0

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

进口是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);
    }
}
于 2018-07-13T14:14:37.453 回答
0

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

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

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

于 2018-07-13T14:33:00.497 回答