Spring @Value 在嵌套配置中不起作用
Spring @Value doesn't work in nested configuration
我有一个 application.properties:
app.cert.identity.subject.organizationalUnit=test
app.cert.identity.subject.O=Pacific College
app.cert.identity.subject.L=CanTho
app.cert.identity.subject.ST=CanTho
app.cert.identity.subject.C=VN
我的class:
@Configuration
@ConfigurationProperties(prefix = "app.cert.identity")
@EnableConfigurationProperties
@Data
public class IdentityCertificateDefinition {
private Subject subject;
@Data
@Configuration
public static class Subject {
private String organizationalUnit; //Does work
@Value("${app.cert.identity.subject.O}") //Does NOT work
private String organization;
@Value("${app.cert.identity.subject.L}") //Does NOT work
private String location;
@Value("${app.cert.identity.subject.ST}") //Does NOT work
private String state;
@Value("${app.cert.identity.subject.C}") //Does NOT work
private String countryCode;
@Value("${app.cert.identity.validity.not-after-in-days}") //Does NOT work
private int notAfterInDays;
}
}
结果如下:
你们可以看到只有 organizationalUnit 有效,其余的无效(全部为空)。我不知道如何使其余属性起作用。我想保留 application.properties.
您可以通过以下代码使用静态 class 配置:
@Configuration
@Data
public class IdentityCertificateDefinition {
@Autowired
private Subject subject;
@Data
@Configuration
public static class Subject {
private String organizationalUnit;
@Value("${app.cert.identity.subject.O}")
private String organization;
@Value("${app.cert.identity.subject.L}")
private String location;
@Value("${app.cert.identity.subject.ST}")
private String state;
@Value("${app.cert.identity.subject.C}")
private String countryCode;
@Value("${app.cert.identity.validity.not-after-in-days}")
private int notAfterInDays;
}
}
如果您不需要在配置 class 中使用静态 class,只需使用:
@Configuration
@Data
public class IdentityCertificateDefinition {
@Value("${app.cert.identity.subject.OU}")
private String organizationalUnit;
@Value("${app.cert.identity.subject.O}")
private String organization;
@Value("${app.cert.identity.subject.L}")
private String location;
@Value("${app.cert.identity.subject.ST}")
private String state;
@Value("${app.cert.identity.subject.C}")
private String countryCode;
@Value("${app.cert.identity.validity.not-after-in-days}")
private int notAfterInDays;
}
问题应该与
有关
@ConfigurationProperties(prefix = "app.cert.identity")
你主要是说这些属性有一个共同的前缀,但是当你注入它们的值时,你又把前缀放了一遍:
@Value("${app.cert.identity.subject.L}")
所以 Spring 正在寻找一个名为(前缀 + class + @Value 的值)的 属性:
@Value("${app.cert.identity.subject.app.cert.identity.subject.L}")
改变
@Value("${app.cert.identity.subject.L}")
到
@Value("${L}")
我有一个 application.properties:
app.cert.identity.subject.organizationalUnit=test
app.cert.identity.subject.O=Pacific College
app.cert.identity.subject.L=CanTho
app.cert.identity.subject.ST=CanTho
app.cert.identity.subject.C=VN
我的class:
@Configuration
@ConfigurationProperties(prefix = "app.cert.identity")
@EnableConfigurationProperties
@Data
public class IdentityCertificateDefinition {
private Subject subject;
@Data
@Configuration
public static class Subject {
private String organizationalUnit; //Does work
@Value("${app.cert.identity.subject.O}") //Does NOT work
private String organization;
@Value("${app.cert.identity.subject.L}") //Does NOT work
private String location;
@Value("${app.cert.identity.subject.ST}") //Does NOT work
private String state;
@Value("${app.cert.identity.subject.C}") //Does NOT work
private String countryCode;
@Value("${app.cert.identity.validity.not-after-in-days}") //Does NOT work
private int notAfterInDays;
}
}
结果如下:
您可以通过以下代码使用静态 class 配置:
@Configuration
@Data
public class IdentityCertificateDefinition {
@Autowired
private Subject subject;
@Data
@Configuration
public static class Subject {
private String organizationalUnit;
@Value("${app.cert.identity.subject.O}")
private String organization;
@Value("${app.cert.identity.subject.L}")
private String location;
@Value("${app.cert.identity.subject.ST}")
private String state;
@Value("${app.cert.identity.subject.C}")
private String countryCode;
@Value("${app.cert.identity.validity.not-after-in-days}")
private int notAfterInDays;
}
}
如果您不需要在配置 class 中使用静态 class,只需使用:
@Configuration
@Data
public class IdentityCertificateDefinition {
@Value("${app.cert.identity.subject.OU}")
private String organizationalUnit;
@Value("${app.cert.identity.subject.O}")
private String organization;
@Value("${app.cert.identity.subject.L}")
private String location;
@Value("${app.cert.identity.subject.ST}")
private String state;
@Value("${app.cert.identity.subject.C}")
private String countryCode;
@Value("${app.cert.identity.validity.not-after-in-days}")
private int notAfterInDays;
}
问题应该与
有关@ConfigurationProperties(prefix = "app.cert.identity")
你主要是说这些属性有一个共同的前缀,但是当你注入它们的值时,你又把前缀放了一遍:
@Value("${app.cert.identity.subject.L}")
所以 Spring 正在寻找一个名为(前缀 + class + @Value 的值)的 属性:
@Value("${app.cert.identity.subject.app.cert.identity.subject.L}")
改变
@Value("${app.cert.identity.subject.L}")
到
@Value("${L}")