Java Spring启动以@ConfigurationProperties为条件
我有一个身份验证服务,我想在运行时自动配置,但它将被模拟用于开发和测试。我想使用Java Spring启动以@ConfigurationProperties为条件,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个身份验证服务,我想在运行时自动配置,但它将被模拟用于开发和测试。我想使用@ConfigurationProperties功能来定义必要的参数,但我还需要能够根据是否配置了实时服务,仅有条件地创建AuthenticationManager实例 我想采用的方法是使用类似于@ConditionalOnBean(AuthProperties.class)的东西,但是 Spring Boot创建my@ConfigurationProperties类的bean,而不管这些属性是否存在。我可以对字段应
@ConfigurationProperties
功能来定义必要的参数,但我还需要能够根据是否配置了实时服务,仅有条件地创建AuthenticationManager
实例
我想采用的方法是使用类似于@ConditionalOnBean(AuthProperties.class)
的东西,但是
Spring Boot创建my
@ConfigurationProperties
类的bean,而不管这些属性是否存在。我可以对字段应用验证注释,但如果未配置实时服务,则上下文将根本不会启动
有没有一种干净的方法可以使配置节以在
@ConfigurationProperties
类中指定属性为条件,而不重复@ConditionalOnProperty
中的属性名称?您不能只使用应用程序的profile-some_profile.properties文件,然后创建您的属性bean吗有条件地像这样
@Profile("some_profile")
@Component
@ConfigurationProperties(prefix = "some.selector")
public Class YourConfiguration{
private property option;
}
这样,它只能根据您选择的live或mock配置文件有条件地创建。
然后,您可以为@Configuration身份验证类使用所选的配置文件来实现不同的方法,也可以使用@ConditionalOnBean。这就是配置文件的用途,或者可能是我误解了这个问题。我有一个类似的问题,我可以通过使用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.user=User
integration.password=Password
integration.project-id=123
integration.project-id=897
integration-prod.properties
integration.user=User
integration.password=Password
integration.project-id=123
integration.project-id=897
Spring Boot将使用属性文件创建bean,对于生产(使用profile
prod
),它将使用另一个文件并覆盖项目id
。当您不使用prod
配置文件时,ignoreResourceNotFound=true
将避免启动时出现FileNotFound异常。Spring Boot自动配置系统的整个要点是适应外部配置信息,而不必指定仅提供冗余信息的切换,基本上是mini-profiles.抱歉,我没有注意到自动配置。我的脑海中没有任何清晰的东西@Component@ConfigurationProperties(prefix=“some.selector”)@Conditional(YourConfiguration.class)public class YourConfiguration实现条件{private property option;@覆盖公共布尔匹配(ConditionContext,AnnotatedTypeMetadata){//某些硬编码属性检查返回(System.getProperty(“servicedefault”)==null);}`不干净,但@Conditional就是这样工作的,bean将根据条件注册,否则无法注册@ConfigurationProperties
对象也可以用来指定默认值,而@ConditionalOnProperty
当然不会选择默认值。因此这仍然是一个非常相关的问题。