Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring启动以@ConfigurationProperties为条件_Java_Spring_Spring Boot - Fatal编程技术网

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
当然不会选择默认值。因此这仍然是一个非常相关的问题。