Java 使用环境变量在@ConfigurationProperties中填充映射

Java 使用环境变量在@ConfigurationProperties中填充映射,java,spring,spring-boot,Java,Spring,Spring Boot,我有这个@ConfigurationProperties: @ConfigurationProperties(prefix = "myapp") public class CustomProperties { private Map<String, String> namespace = new HashMap<>(); public Map<String, String> getNamespace() { return n

我有这个@ConfigurationProperties:

@ConfigurationProperties(prefix = "myapp")
public class CustomProperties {

    private Map<String, String> namespace = new HashMap<>();

    public Map<String, String> getNamespace() {
        return namespace;
    }
}
如果成功运行,名称空间映射将包含四个条目:

{namespace2.id=ccc, namespace1.connection=xxxx, namespace2.topic=zzz, namespace1.url=yyy}
现在我正在将应用程序归档。如何使其与环境变量一起工作?我试过:

MYAPP_NAMESPACE_NAMESPACE1.CONNECTION="xxxx"
MYAPP_NAMESPACE_NAMESPACE1.URL="yyy"
MYAPP_NAMESPACE_NAMESPACE2.TOPIC="zzz"
MYAPP_NAMESPACE_NAMESPACE2.ID="ccc"

但它不起作用。你能帮我吗


谢谢Fernando。

我认为您可以通过执行@Value${MYAPP\u NAMESPACE\u NAMESPACE1\u CONNECTION}或您环境变量中的任何键来初始化它

然后给它你想要的变量,就像这样

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

我认为您可以通过执行@Value${MYAPP\u NAMESPACE\u NAMESPACE1\u CONNECTION}或您环境变量中的任何键来初始化它

然后给它你想要的变量,就像这样

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

您可以使用占位符将这些属性映射到spring概要文件中的环境变量,即application.properties/yml或bootstrap.properties/yml文件中的应用程序或引导程序属性。您可以映射到环境变量占位符,如下所示。这些将解析为相应的环境变量

myapp.namespace.namespace1.connection=${MYAPP_NAMESPACE_NAMESPACE1_CONNECTION}
myapp.namespace.namespace1.url=${MYAPP_NAMESPACE_NAMESPACE1_CONNECTION}
myapp.namespace.namespace2.topic=${MYAPP_NAMESPACE_NAMESPACE1_CONNECTION}
myapp.namespace.namespace2.id=${MYAPP_NAMESPACE_NAMESPACE2_ID}
如果您事先知道属性名称,并且只知道前缀:

您只需使用一个占位符进行映射,并通过附加该占位符和下划线提供环境变量,如:

myapp.namespace=${MYAPP_NAMESPACE}
如果提供env变量

MYAPP_NAMESPACE_NAMESPACE1_CONNECTION=xxx
Springboot足够聪明,可以解决这个问题

myapp.namespace.namespace1.connection==xxx
您只需按照惯例使用下划线即可,下划线将解析为点

我们正在应用程序中使用它。我还测试了这个特定场景,当它打印名称空间时,如下所示:

{namespace1.connection=xxxx}

我希望我正确理解了您希望在这里实现的目标。

您可以使用占位符将这些属性映射到spring概要文件中的环境变量,即application或bootstrap属性,如application.properties/yml或bootstrap.properties/yml文件中的application或bootstrap属性。您可以映射到环境变量占位符,如下所示。这些将解析为相应的环境变量

myapp.namespace.namespace1.connection=${MYAPP_NAMESPACE_NAMESPACE1_CONNECTION}
myapp.namespace.namespace1.url=${MYAPP_NAMESPACE_NAMESPACE1_CONNECTION}
myapp.namespace.namespace2.topic=${MYAPP_NAMESPACE_NAMESPACE1_CONNECTION}
myapp.namespace.namespace2.id=${MYAPP_NAMESPACE_NAMESPACE2_ID}
如果您事先知道属性名称,并且只知道前缀:

您只需使用一个占位符进行映射,并通过附加该占位符和下划线提供环境变量,如:

myapp.namespace=${MYAPP_NAMESPACE}
如果提供env变量

MYAPP_NAMESPACE_NAMESPACE1_CONNECTION=xxx
Springboot足够聪明,可以解决这个问题

myapp.namespace.namespace1.connection==xxx
您只需按照惯例使用下划线即可,下划线将解析为点

我们正在应用程序中使用它。我还测试了这个特定场景,当它打印名称空间时,如下所示:

{namespace1.connection=xxxx}

我希望我正确地理解了您希望在这里实现的目标。

我正在寻找一个带有Map的解决方案,而不是一个字符串。有可能我不理解您的问题,但所有属性都是字符串,对吗?您只是将键存储为变量,将值存储为变量的值。它们将是我事先不知道的属性。哦,我明白了,我想我错过了这一部分,您可以使用System.getProperties函数吗?我正在寻找一个带有Map的解决方案,而不是一个字符串。有可能我不理解您的问题,但是所有的属性都是字符串,对吗?您只是将键存储为变量,将值存储为变量的值。它们将是我事先不知道的属性。哦,我明白了,我想我错过了这一部分,您可以使用System.getProperties函数吗?您是通过docker run命令还是使用docker compose发送这些环境变量?请你编辑这篇文章并澄清一下,我正在用库伯内特斯的地图发送它。它使用单个字符串,但不使用映射。您是通过docker run命令还是使用docker compose发送这些环境变量?请你编辑这篇文章并澄清一下,我正在用库伯内特斯的地图发送它。它只适用于单个字符串,但不适用于地图。它们将是我事先不知道的属性。请检查我的更新答案。如果我没有正确理解您的问题,请告诉我。它们将是我事先不知道的属性。请检查我的更新答案。如果我没有正确理解你的问题,请告诉我。