【问题标题】:Springboot not replacing environment variables in application.properties fileSpring Boot 不替换 application.properties 文件中的环境变量
【发布时间】:2017-07-20 13:40:56
【问题描述】:

我正在尝试使用 SpringBoot 运行 Quartz Scheduler。使用 Quartz Jdbc 数据存储。出于安全原因,我们希望从属性文件中选择 Db 凭据。根据我从这里(Using env variable in Spring Boot's application.properties)和 springBoot 文档的理解,SpringBoot 会自动替换 application.properties 中的环境变量,但我没有看到这个。这是我在运行应用程序之前采购的系统环境文件

export DB_HOST=localhost
export DB_PORT=11111
export DB_USER=root
export DB_PASSWORD=root
export QUARTZ_DB_NAME=quartz

这是我的 application.properties

org.quartz.dataSource.quartzDataSource.URL =jdbc:mysql://${DB_HOST}:${DB_PORT}/${QUARTZ_DB_NAME}
org.quartz.dataSource.quartzDataSource.user = ${DB_USER}
org.quartz.dataSource.quartzDataSource.password = ${DB_PASSWORD}

还有我的配置类

@Configuration
public class ConfigureQuartz {

@Autowired
private ApplicationContext applicationContext;

@Bean
public SchedulerFactoryBean schedulerFactoryBean() throws IOException
{
    final SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();
    quartzScheduler.setSchedulerName("mdsScheduler");

    quartzScheduler.setQuartzProperties(quartzProperties());
    final AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory();
    jobFactory.setApplicationContext(applicationContext);
    quartzScheduler.setJobFactory(jobFactory);
    return quartzScheduler;
}



 @Bean
 public Properties quartzProperties() throws IOException {
  final PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
  propertiesFactoryBean.setLocation(new ClassPathResource("/application.properties"));
  propertiesFactoryBean.afterPropertiesSet();
  return propertiesFactoryBean.getObject();

}

但是当我使用 java -jar .java 运行我的 spring 应用程序时,我没有看到被替换的值。

我可以通过使用 System.getEnv() 读取值来解决问题,但如果这些值可以被替换,那就太好了。不知道为什么它不起作用:(

【问题讨论】:

  • 当然它不会替换占位符。您正在使用PropertiesFactoryBean 自己加载属性。占位符替换是启动/属性占位符功能。
  • 那么,如果我不使用 PropertiesFactoryBean ,它应该可以自己使用?
  • Spring Boot 已经加载了该文件,所有属性都可以通过 Environment 对象获得。
  • 但是 springboot 会替换 application.properties 中的值,以便我可以从那里使用它。
  • 它已经取代了它们。如前所述,它们已做好充分准备。

标签: java spring-boot quartz-scheduler


【解决方案1】:

Spring-boot 允许我们提供多种方式来提供外部化配置,你可以尝试使用application.yml 或yaml 文件代替属性文件,并根据不同的环境提供不同的属性文件设置。我们可以为每个环境分离出属性到单独的弹簧配置文件下单独的 yml 文件中。然后在部署期间您可以使用:

java -jar -Drun.profiles=SpringProfileName

指定要使用的弹簧配置文件。注意yml文件的名称应类似于

application-{environmentName}.yml

让它们被 springboot 自动占用。 参考:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-profile-specific-properties

从 application.yml 或属性文件中读取:

从属性文件或yml中读取值最简单的方法是使用spring@value注解。Spring会自动将yml中的所有值加载到spring环境中,所以我们可以直接使用环境中的那些值,例如:

@Component
public class MyBean {

    @Value("${name}")
    private String name;

    // ...

}

或者spring提供的另一种读取强类型bean的方法如下:

YML

acme:
    remote-address: 192.168.1.1
    security:
        username: admin
        roles:
          - USER
          - ADMIN

对应POJO读取yml:

@ConfigurationProperties("acme")
public class AcmeProperties {

    private boolean enabled;

    private InetAddress remoteAddress;

    private final Security security = new Security();

    public boolean isEnabled() { ... }

    public void setEnabled(boolean enabled) { ... }

    public InetAddress getRemoteAddress() { ... }

    public void setRemoteAddress(InetAddress remoteAddress) { ... }

    public Security getSecurity() { ... }

    public static class Security {

        private String username;

        private String password;

        private List<String> roles = new ArrayList<>(Collections.singleton("USER"));

        public String getUsername() { ... }

        public void setUsername(String username) { ... }

        public String getPassword() { ... }

        public void setPassword(String password) { ... }

        public List<String> getRoles() { ... }

        public void setRoles(List<String> roles) { ... }

    }
}

上述方法适用于 yml 文件。

参考: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

从环境中读取:

如果您在 linux 上运行应用程序,请将环境设置如下:

export DB_HOST=localhost
export DB_PORT=11111
export DB_USER=root
export DB_PASSWORD=root
export QUARTZ_DB_NAME=quartz

如果您在 Windows 上,请将其设置为:

SET DB_HOST=localhost
SET DB_PORT=11111
SET DB_USER=root
SET DB_PASSWORD=root
SET QUARTZ_DB_NAME=quartz

在您的 application.properties 中,如果您保留以下键,它应该会自动从环境中解析值:

spring.datasource.url = ${DB_HOST}/"nameofDB"
spring.datasource.username = ${DB_USER}
spring.datasource.password = ${DB_PASSWORD}

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 2019-03-10
    • 2016-11-15
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2016-08-08
    • 1970-01-01
    相关资源
    最近更新 更多