Получение значений из конфигурации yml в зависимость - PullRequest
0 голосов
/ 10 октября 2019

У меня есть класс:

@WebServiceClient(name = "${service.name}", targetNamespace = "${service.namespace}", wsdlLocation = "${service.wsdlLocation}")
public class ExampleService extends Service {
    @Value("${service.wsdlLocation}")
    private static String wsdlLocation;
}

Это часть проекта mvn, которую я компилирую и использую из своего локального репозитория maven в качестве зависимости от моего другого приложения весенней загрузки, которое имеет конфигурацию yml:

service:
  name: name
  namespace: namespace
  wsdlLocation: wsdlLocation

Есть ли способ, которым этот класс ExampleService будет использовать конфигурацию "родительского" проекта?

РЕДАКТИРОВАТЬ:

Появились два ответа, но я чувствовал, что сделалне задать вопрос четко. Теперь я хочу использовать класс ExampleService в моем «родительском» проекте и заставить его видеть конфигурацию этого родительского проекта. До сих пор, когда, например, я пишу в родительском проекте код, например:

ExampleService exampleService = new ExampleService();
System.out.println(exampleService.getWsdlLocation());

Null печатается. Поэтому я ищу какое-то решение для этого.

РЕДАКТИРОВАТЬ 2: Вот мои занятия. Родительский проект:

package com.example.kris.parentservice;

import com.example.kris.childservice.ExampleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/example")
public class ExampleController {

//    @Autowired
    private ExampleService exampleService;
    @Value(value = "${service.wsdlLocation}")
    private String wsdlLocation;

    @GetMapping(value = "/example")
    public void example() {
        exampleService = new ExampleService();
        System.out.println("ExampleService field: " + exampleService.getWsdlLocation());
        System.out.println("@Value: " + wsdlLocation);
    }
}

Дочерний проект:

package com.example.kris.childservice;

import org.springframework.beans.factory.annotation.Value;

public class ExampleService {
    @Value("${service.wsdlLocation}")
    private String wsdlLocation;

    public String getWsdlLocation() {
        return wsdlLocation;
    }
}

И вывод после запуска родительского контроллера:

ExampleService field: null
@Value:test.wsdl.location

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Spring Boot использует очень специфический порядок PropertySource, который предназначен для разумного переопределения значений. Свойства рассматриваются в следующем порядке: Источник

Основываясь на том же, вы можете решить, какие свойства будут действовать. Если ключ свойства дублируется, последний объявленный файл будет 'win' и переопределять.

  1. Devtools свойства глобальных настроек в вашем домашнем каталоге (~ /.spring-boot-devtools.properties, когда devtools активен).

  2. @ TestPropertySource аннотации к вашим тестам.
  3. атрибут свойств к вашим тестам. Доступно на @SpringBootTest и тестовых аннотациях для тестирования определенного фрагмента вашего приложения.
  4. Аргументы командной строки.
  5. Свойства из SPRING_APPLICATION_JSON (встроенный JSON, встроенный в переменную среды или системное свойство).
  6. Параметры инициализации ServletConfig.
  7. ServletContext initпараметры.
  8. Атрибуты JNDI из java: comp / env.
  9. Свойства системы Java (System.getProperties ()).
  10. Переменные среды ОС.
  11. RandomValuePropertySource со свойствами только в случайном порядке. *.
  12. Свойства приложения для конкретного профиля вне вашего упакованного jar (application- {profile} .properties и варианты YAML).
  13. Приложение для конкретного профилясвойства, упакованные внутри вашего jar
    (application- {profile} .properties и варианты YAML).
  14. Свойства приложения вне вашего упакованного jar (application.properties и YAML варианты).
  15. Applicationсвойства, упакованные внутри вашего jar
    (application.properties и YAML варианты).
  16. @ PropertySource annotв ваших классах @Configuration.

  17. Свойства по умолчанию (задаются настройкой SpringApplication.setDefaultProperties).

Редактировать: Как уже упоминалось в вашем редактировании, вы создаете новый объект, используя следующий код

ExampleService exampleService = new ExampleService();
System.out.println(exampleService.getWsdlLocation())

Это создаст объект из пружины, вы должны использовать автопроводку

@Autowired
private ExampleService exampleService ;

System.out.println(exampleService.getWsdlLocation())
0 голосов
/ 10 октября 2019

YamlPropertySourceLoader может быть полезен при весенней загрузке приложения, добавляющего bean-компонент, подобный этому

@Bean
public PropertySource<?> yamlPropertySourceLoader() throws IOException {
    YamlPropertySourceLoader loader = new YamlPropertySourceLoader();
    PropertySource<?> applicationYamlPropertySource = loader.load("application.yml",
            new ClassPathResource("application.yml"), "default");
    return applicationYamlPropertySource;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...