【发布时间】:2019-11-25 17:40:41
【问题描述】:
我编写了许多通过 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 并失败(原因很明显)。
如何将我的覆盖值设置到这些配置项中?有没有办法推迟或延迟“默认”加载,以便我的值生效?有没有其他技术可以让它们进入那里?
【问题讨论】:
-
docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/… 除非我很困惑,否则应该是
--而不是-D? -
你说的很对。谢谢。
标签: java spring-boot configuration