5

我正在尝试从ldap-TEST.properties文件中读取 ldap 属性并尝试将其绑定到 java 配置类。因为我已经 @PropertSource为 propertysourcesplaceholderconfigurer 指定并定义了一个静态 Bean。我仍然收到无法解析spring.profiles.active类路径中的占位符:/ldap-${spring.profiles.active}.properties下面是项目文件,请帮助我

@Configuration
@PropertySource("classpath:/ldap-${spring.profiles.active}.properties")
public class LdapConfig { 
 @Autowired
 Environment env;
@Bean
public LdapContextSource contextSource() {
    LdapContextSource contextSource = new LdapContextSource();
    contextSource.setUrl(env.getRequiredProperty("ldap.url"));
    contextSource.setBase(env.getRequiredProperty("ldap.base"));
    contextSource.setUserDn(env.getRequiredProperty("ldap.userDn"));
    contextSource.setPassword(env.getRequiredProperty("ldap.password"));
    contextSource.afterPropertiesSet();
    return contextSource;
}

@Bean
public LdapTemplate ldapTemplate() {
    return new LdapTemplate(contextSource());
}

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

}

//ldap-TEST.properties file
ldap.base=dc=example,dc=com
ldap.password=password
ldap.port=839
ldap.userDn=cn=read-only-admin,dc=example,dc=com
ldap.url=ldap://ldap.forumsys.com:389

我的主要应用

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
       SpringApplication.run(Application.class, args);
 }

}

4

3 回答 3

1

后面的值spring.profiles.active其实是一个数组。因此,即使该值已正确扩展,也会有一些极端情况无法按您想要的方式工作。

如果通过配置的路径@PropertySource能够以相同的方式工作,那就太好了application.properties|yml,但目前情况并非如此(GitHub 上有一个关于此的活跃问题)。所以必须考虑替代方案:

  1. 最简单的替代方法是使用常规文件名application.properties|ymlapplication-{profile}.properties|yml. 我没有看到任何不这样做的充分理由,但我不知道您的项目要求,所以......
  2. 稍微复杂一点,使用 Java 代码获取配置的配置文件,并以编程方式配置 Spring 环境。有关更多详细信息,请参阅此 SO 答案
于 2018-08-21T08:02:20.137 回答
1

您不能${spring.profiles.active}在 spring 中使用类型注释的内部字符串值之类的属性。此类属性将被注入到@Value用于属性或方法的注释中。

于 2018-08-21T07:30:01.947 回答
0

如果您在本地机器上运行,那么只需更改属性文件名 application-default.property 即可临时立即工作。

对于永久解决方案,您必须检查您的项目是否在 docker 上运行:

如果在 docker 上运行,则使用以下命令:

  1. mvn clean package -DskipTests=true && sudo docker build
  2. sudo docker run -d -e spring.profiles.active="local" -e <other key and value of bootstrap.property file>

否则,如果在云服务器上运行,请按照以下步骤操作:

  1. 在 bootstrap.property 文件中放spring.profiles.active=local
  2. 将应用程序文件重命名为application-local.properties

也可以参考: 配置文档2.3.3. Profile Specific Files中的部分

于 2022-02-04T02:48:05.027 回答