Вводить значения с помощью Spring и YAML с вложенными свойствами - PullRequest
0 голосов
/ 07 августа 2020

Я хочу вставить некоторые значения из YAML в контекст Spring. Структура YAML аналогична, поэтому я не хотел дублировать код, но запуск Spring завершается ошибкой, потому что он не может ввести значение в заполнитель.

Обратите внимание на мой application.properties:

server.port=8084

activeProfile=dev

autoAgents.supplier.id=0
autoAgents.supplier.name=test
autoAgents.supplier.serviceType=REST
autoAgents.supplier.authType=1
autoAgents.supplier.adapter=test
autoAgents.supplier.username=test
autoAgents.supplier.secret=test
autoAgents.supplier.apiPassword=12345

autoAgents.client.id=1
autoAgents.client.name=test
autoAgents.client.serviceType=REST
autoAgents.client.authType=1
autoAgents.client.adapter=
autoAgents.client.username=test
autoAgents.client.secret=test
autoAgents.client.apiPassword=12345

Затем я вставляю эти значения в YAML, application.yml

activeProfile: ${activeProfile}

autoAgents:
    supplier:
        isSupplier: true
        meta:
            id: ${autoAgents.supplier.id}
            name: ${autoAgents.supplier.name}
            serviceType: ${autoAgents.supplier.serviceType}
            authType: ${autoAgents.supplier.authType}
            adapter: ${autoAgents.supplier.adapter}
        credentials:
            username: ${autoAgents.supplier.username}
            secret: ${autoAgents.supplier.secret}
            apiPassword: ${autoAgents.supplier.apiPassword}
    client:
    isSupplier: false
    meta:
        id: ${autoAgents.client.id}
        name: ${autoAgents.client.name}
        serviceType: ${autoAgents.client.serviceType}
        authType: ${autoAgents.client.authType}
        adapter: ${autoAgents.client.adapter}
    credentials:
        username: ${autoAgents.client.username}
        secret: ${autoAgents.client.secret}
        apiPassword: ${autoAgents.client.apiPassword}

И затем я импортирую это в контекст свойства конфигурации:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties    
@Data
public class TwoConnectConfigurationProperties {
    
    private String activeProfile;
    @Value("${autoAgents.supplier}")
    private AutoAgentDup supplier;
    @Value("${autoAgents.client}")
    private AutoAgentDup client;
}

Но @Value("${autoAgents.supplier}") не работает.

Посоветуйте, пожалуйста.

Ответы [ 2 ]

1 голос
/ 07 августа 2020

Как упоминалось ранее, не имеет смысла вводить значения в yaml, вы можете просто создать "application.yaml" напрямую со значениями. И просто удалите файл ".properies".

Возможно, вы захотите посмотреть, как легко вставить свойства с общим суффиксом в bean-компонент. Его хорошо описано здесь: https://www.baeldung.com/configuration-properties-in-spring-boot

У вас будет bean-компонент:

@Configuration
@ConfigurationProperties(prefix = "autoAgents.supplier")
public class AutoAgentSupplierProperties {

  private long id;
  private String name;
  // ... rest of the properies properties
}

Возможно, вам понадобится то же самое для клиента auto.agent.

Если вы хотите избежать дублирования кода, вы можете иметь bean-компонент с общими свойствами. Расширьте этот класс двумя новыми классами. Один для поставщика и один для агента - и пометьте их аннотацией

@ ConfigurationProperties

.

0 голосов
/ 07 августа 2020

Зачем нужны «вложенные свойства»? Если вы хотите получить к ним доступ только в приложении, просто возьмите значения из файла .properties и заполните их как значения в файле .yml. Например: profile: dev или

autoAgents:
  client:
    id: 1

К свойствам из файла .yml можно получить доступ из кода так же, как из файла .properties.

Ваша проблема в том, как вы получаете доступ к свойствам. Когда вы используете «@Configuration properties», вы должны указать c, какой из них использовать (например, @ConfigurationProperties("autoAgents.client").

...