Java 如何强制通过@Value注释进行属性注入?

Java 如何强制通过@Value注释进行属性注入?,java,spring,spring-annotations,Java,Spring,Spring Annotations,我使用@ConfigurationProperties注释从属性文件填充以下Test.java POJO类。我已经看到了@Required注释的用法,使其成为强制注释 除了在setter方法级别定义注释外,@Value注释中是否有任何注释或选项可用于定义条件,如强制、NotNull等 @Component @ConfigurationProperties(prefix = "com.test") public class Test { private String name; @Req

我使用
@ConfigurationProperties
注释从属性文件填充以下Test.java POJO类。我已经看到了
@Required
注释的用法,使其成为强制注释

除了在setter方法级别定义注释外,
@Value
注释中是否有任何注释或选项可用于定义条件,如强制、NotNull等

@Component
@ConfigurationProperties(prefix = "com.test")
public class Test {
  private String name;

  @Required
  public void setName(String name) {
    name = name;
  }

  public String getName(String name) {
    name = name;
  }
}

这是使特定属性成为强制性的正确且唯一的方法吗?对于这些条件或验证目的,我还可以使用哪些注释?

您可以对属性使用验证,但不是按照您设想的方式。 您可以在字段(或setter)本身上使用标准验证注释(如
@NotNull
等)

比如说

@NotNull
@Size(min=2, max=10)
private String name;
查看部分文档

文档本质上说的是,您只需要在类路径上有一个兼容的JSR303验证器实现,并使用相关的注释。 Spring Boot将处理剩余的

根据Spring(目前为4.1.6.版本),
注释只有一个属性,
,包含该属性的值。您可以在其中放置Spring EL表达式,但这不允许您显式地表达非空等概念

此外,在代码片段中,您使用的是
@ConfigurationProperties
,与
@Value
注释相比,这是配置属性值的另一种方法

按照这种方式,Java getter/setter名称需要映射到属性名称,即前缀“com.test”+
getName()
/
setName()
匹配属性
com.test.name=…
因此,您不需要使用
@Value
注释来告诉Spring要使用什么属性

使用
@Value
方法,您的getter/setter不必匹配属性名称,但您必须对每个属性进行注释,例如
@Value(${com.test.name}”)
在类上,一个
@PropertySource
注释指向包含
com.test.name=…


我发现了几篇博客文章,其中有代码示例,它们使用了两种不同的方法来注入相同的属性:和

不确定spring,但如果您愿意使用hibernate来脏化pojo,那么这是可能的,或者您可以创建一个自定义注释。请参阅,但提问者会问:除了在setter方法级别定义注释外,@Value注释中是否有任何注释或选项可用于定义强制、非空等条件?@AndrewSpencer您是对的,我需要澄清答案