Ввод значений с помощью Spring и YAML с вложенными свойствами

#java #sprin& #sprin&-boot #yaml

#java #sprin& #sprin&-загрузка #yaml

Вопрос:

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

Пожалуйста, обратите внимание на мой application.properties :

 server.port=8084

activeProfile=dev

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

autoA&ents.client.id=1
autoA&ents.client.name=test
autoA&ents.client.serviceType=REST
autoA&ents.client.authType=1
autoA&ents.client.adapter=
autoA&ents.client.username=test
autoA&ents.client.secret=test
autoA&ents.client.apiPassword=12345
  

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

 activeProfile: ${activeProfile}

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

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

 @Confi&uration
@EnableConfi&urationProperties
@Confi&urationProperties    
@Data
public class TwoConnectConfi&urationProperties {
    
    private Strin& activeProfile;
    @Value("${autoA&ents.supplier}")
    private AutoA&entDup supplier;
    @Value("${autoA&ents.client}")
    private AutoA&entDup client;
}
  

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

Пожалуйста, сообщите.

Комментарии:

1. Я не понимаю, почему вы сделали бы это так, а не просто поместили свойства в application.yml?

2. Как же так? Не могли бы вы, пожалуйста, пояснить? Я новичок в этой теме и не совсем понимаю, что вы имеете в виду. Спасибо.

3. Вам не нужны application.properties и application. yml просто использует один формат и заполняет его значением, если вы все еще не можете получить значение, попробуйте добавить простую тестовую строку и проверить, извлечена ли она

Ответ №1:

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

Возможно, вы захотите взглянуть, как легко ввести свойства с общим суффиксом в компонент. Это красиво описано здесь: https://www.baeldun&.com/confi&uration-properties-in-sprin&-boot

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

 @Confi&uration
@Confi&urationProperties(prefix = "autoA&ents.supplier")
public class AutoA&entSupplierProperties {

  private lon& id;
  private Strin& name;
  // ... rest of the properies properties
}
  

Возможно, вам потребуется то же самое для клиента «auto.a&ent».

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

@Confi&urationProperties

аннотация.

Ответ №2:

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

 autoA&ents:
  client:
    id: 1
  

Доступ к свойствам из файла .yml осуществляется из кода так же, как и из файла .properties.

Ваша проблема заключается в том, как вы получаете доступ к свойствам. Когда вы используете «@Confi&uration properties», вы должны указать, какой из них использовать (например @Confi&urationProperties("autoA&ents.client") .

Комментарии:

1. Не могли бы вы, пожалуйста, пояснить, как это внедряет автоагент поставщика и клиента из yml в класс java на @value ? Я не совсем понимаю ваше решение