我有一个身份验证服务,我想在运行时自动配置,但这将被模拟用于开发和测试。我想使用@ConfigurationProperties
功能来定义必要的参数,但我还需要能够有条件地创建AuthenticationManager
实例,具体取决于是否配置了实时服务。
我想采取的方法是使用@ConditionalOnBean(AuthProperties.class)
之类的东西,但是
无论属性是否存在,Spring Boot都会创建我的@ConfigurationProperties
类的bean。我可以将验证注释应用于字段,但如果未配置实时服务,则上下文根本不会启动。
是否有一种干净的方法可以使配置部分取决于@ConfigurationProperties
类中指定的属性而不重复@ConditionalOnProperty
中的属性名称?
答案 0 :(得分:0)
您不能只使用application-some_profile.properties文件的配置文件,然后有条件地创建属性bean
@Profile("some_profile")
@Component
@ConfigurationProperties(prefix = "some.selector")
public Class YourConfiguration{
private property option;
}
这种方式只能根据您选择的实时或模拟配置文件有条件地创建。 您可以使用@Configuration身份验证类的选定配置文件进行单独的方法,也可以使用@ConditionalOnBean。这就是配置文件的用途,或者我误解了这个问题。
答案 1 :(得分:0)
我有类似的问题,我可以使用Spring Boot和Java 8解决这个问题,希望它可以帮助某人:
@Configuration
@PropertySources({
@PropertySource("classpath:integration.properties"),
@PropertySource(value = "classpath:integration-${spring.profiles.active}.properties", ignoreResourceNotFound = true)
})
@ConfigurationProperties(prefix = "integration")
public class IntegrationProperties {
private String user;
private String password;
private String projectId;
....
}
<强> integration.properties 强>
integration.user=User
integration.password=Password
integration.project-id=123
<强> integration-prod.properties 强>
integration.project-id=897
Spring Boot将使用属性文件创建bean,并且对于生产(使用配置文件prod
),它将使用另一个文件并覆盖project-id
。当您不使用ignoreResourceNotFound = true
个人资料时,prod
将在启动时避免FileNotFoundException。