Spring Boot配置覆盖被忽略

时间:2019-11-25 17:40:41

标签: java spring-boot configuration

我编写了许多通过REST API调用进行通信的服务。可以将服务配置为使用HTTP或HTTPS。任何给定的客户端都具有定义与服务器的连接的安全性配置。通过application.yml中的值来设置“默认”配置属性,并且到目前为止,这种配置效果很好。

但是,我已经意识到,这对于更现实的情况不起作用。问题是我正在尝试设置特定的参数,例如启动客户端时的服务器主机/端口,而忽略我设置的值。

一个例子:

服务A(客户端)将出于某种目的与服务B(服务器)通信。 服务A的安全配置如下所示:

@Configuration
@EnableConfigurationProperties({ClientConnectionProperties.class,
    SecurityCertificateProperties.class})
public class ClientSecurityConfiguration {
  ...
}

@ConfigurationProperties("client.connection")
public class ClientConnectionProperties {
  ...
}

@ConfigurationProperties("server.ssl")
public class SecurityCertificateProperties {
  ...
}

application.yml具有定义给配置对象中的值的各种属性的定义。

client:
  connection:
    scheme: https
    host: localhost
    port: 8443

server:
  port: 7081
  ssl:
    enabled: true
    protocol: TLS
    trust-store-type: JKS
    trust-store: classpath:server.truststore
    trust-store-password: <password>
    key-store-type: JKS
    key-store: classpath:server.keystore
    key-store-password: <password>

当客户端和服务器都在本地主机上运行时,这很好。但是,我正在测试它们在不同主机上的运行位置,因此我需要将client.connection.host从本地主机覆盖到实际主机。我通过在启动客户端时将-Dclient.connection.host=<host>指定为VM参数来完成此操作。不幸的是,这不起作用。客户端最终尝试连接到localhost并失败(出于明显的原因)。

如何将我的替代值设置到这些配置项中?有没有办法推迟或延迟“默认”加载,使我的值生效?还有其他一些技巧可用来使它们在那里吗?

1 个答案:

答案 0 :(得分:1)

您可以使用Spring参数而不是JVM参数来覆盖Spring Boot属性。

示例:

java -jar your-app.jar --client.connection.host=<host>

相关问题:https://stackoverflow.com/a/37053004/12355118