在使用Spring注入@Value时,您可以随意使用propertySource吗?

时间:2019-04-25 14:26:46

标签: spring spring-boot properties inject

例如,我有两个propertySource(CompositePropertySource),它们包含相同的属性(从执行器/ env端点中提取):

{"propertySources": [
    {
      "name": "aws-secrets-manager:my-api-1",
      "properties": {
        "id": {
          "value": "ABC"
        },
        "password": {
          "value": "123"
        }
      }
    },
    {
      "name": "aws-secrets-manager:my-api-2",
      "properties": {
        "id": {
          "value": "JKL"
        },
        "password": {
          "value": "567"
        }
      }
    },
    {
      "name": "systemProperties"
      ....
    }
]}

如您所见,我有两个propertySource,它们包含相同的属性但值不同(它们用于存储外部API的秘密)。

如果我只有一个propertySource并且尝试插入id值:

@Value("${id}")
private String api1Id;

它运行完美。

但是我想做的是注入2个不同服务,即2 propertySource的ID,例如:

// MyApi1Service.class
@Value("${aws-secrets-manager:my-api-1.id}")
private String api1Id;

// MyApi2Service.class
@Value("${aws-secrets-manager:my-api-2.id}")
private String api2Id;

这不起作用,因为SpEL将分号解释为默认值,因此我得到了api1Id="my-api-1.id"api2Id="my-api-2.id"。没问题。

所以我尝试以与systemProperties相同的方式进行操作:

@Value("#{systemProperties['java.runtime.name']}")

这样做:

// MyApi1Service.class
@Value("#{aws-secrets-manager:my-api-1['id']}")
private String api1Id;

它不起作用。 我尝试过:

// MyApi1Service.class
@Value("#{'${aws-secrets-manager:my-api-1}'['id']}")
private String api1Id;

它也不起作用。我尝试了许多不同的语法,但均未成功。

我什至不确定是否可行?需要注意的是,我所有公司的aws机密的名称(id:密码)都是相同的。

所以问题是:我们可以指定要在@Value中使用的propertySource的名称吗?

谢谢:)

0 个答案:

没有答案