Конфигурирование нескольких yml-файлов в соответствующем классе конфигурации (Spring Boot) - PullRequest
0 голосов
/ 16 февраля 2020

У меня более одного yml-файла в Spring Boot в месте пути к классу ресурса, как в следующей структуре Spring Boot. Первоначально я написал только для application-ab c .yml, и в то время все значения этого файла загружались в соответствующий им класс, но когда я добавил другой файл application-xyz.yml, он также загружается в соответствующий им класс. классы конфигурации, но в настоящее время загружаются только значения application-xyz.yml в обоих классах конфигурации. Итак, нужна помощь, чтобы настроить значения обоих файлов в соответствующих им файлах конфигурации в одной сборке:

-src
  -main
     -java
        -packages
          -config
             -ApplicationAbcConfig.java
             -ApplicationConfig.java
             -ApplicationFactory.java
             -ApplicationXyzConfig.java
             -Authentication.java
             -Operations.java
             -Payload.java
             -RequestPayload.java
             -ResponsePayload.java

         -services
             -YmlConfigurationSelection.java

         -resources
            -application.yml
            -application-abc.yml
            -application-xyz.yml

         -MultipleYmlDemoProject.java

Содержимое application-ab c .yml

authentication:
  name: name
  type: type
  payload:
    request:
      - sequence: 1
        attributes:
          - attributes1
          - attributes2
    response:
      - sequence: 1
        attributes:
          - attributes3
          - attributes4

operations:
  name: name
  type: type
  payload:
    request:
      - sequence: 1
        attributes:
          - attributes5
          - attributes6
    response:
      - sequence: 1
        attributes:
          - attributes7
          - attributes8

Содержимое application-xyz.yml

authentication:
  name: name
  type: type
  payload:
    request:
      - sequence: 1
        attributes:
          - attributes9
          - attributes10
    response:
      - sequence: 1
        attributes:
          - attributes11
          - attributes12

operations:
  name: name
  type: type
  payload:
    request:
      - sequence: 1
        attributes:
          - attributes13
          - attributes14
    response:
      - sequence: 1
        attributes:
          - attributes15
          - attributes16

Содержимое ApplicationConfig. java

public interface ApplicationConfig {
    public Authentication getAuthentication();

    public void setAuthentication(Authentication authentication);

    public Operations getOperations();

    public void setOperations(Operations operations);
}

Содержание аутентификации. java

public class Authentication {
    private String name;
    private String type;
    private Payload payload;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Payload getPayload() {
        return payload;
    }

    public void setPayload(Payload payload) {
        this.payload = payload;
    }
}

Содержание операций. java

public class Operations {
    private String name;
    private String type;
    private Payload payload;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Payload getPayload() {
        return payload;
    }

    public void setPayload(Payload payload) {
        this.payload = payload;
    }
}

Содержимое полезной нагрузки. java

public class Payload {
    private List<RequestPayload> request;
    private List<ResponsePayload> response;

    public List<RequestPayload> getRequest() {
        return request;
    }

    public void setRequest(List<RequestPayload> request) {
        this.request = request;
    }

    public List<ResponsePayload> getResponse() {
        return response;
    }

    public void setResponse(List<ResponsePayload> response) {
        this.response = response;
    }
}

Содержимое RequestPayload. java

public class RequestPayload {
    private String sequece;
    private List<String> attributes;

    public String getSequece() {
        return sequece;
    }

    public void setSequece(String sequece) {
        this.sequece = sequece;
    }

    public List<String> getAttributes() {
        return attributes;
    }

    public void setAttributes(List<String> attributes) {
        this.attributes = attributes;
    }
}

Содержимое ResponsePayload. java

public class ResponsePayload {
    private String sequece;
    private List<String> attributes;

    public String getSequece() {
        return sequece;
    }

    public void setSequece(String sequece) {
        this.sequece = sequece;
    }

    public List<String> getAttributes() {
        return attributes;
    }

    public void setAttributes(List<String> attributes) {
        this.attributes = attributes;
    }
}

Содержимое ApplicationAbcConfig. java

@Configuration
@SpringBootConfiguration
@EnableConfigurationProperties
@org.springframework.context.annotation.PropertySource("classpath:application-abc.yml")
public class ApplicationAbcConfig implements ApplicationConfig, PropertySourceFactory {
    private Authentication authentication;
    private Operations operations;

    @Override
    public Authentication getAuthentication() {
        return authentication;
    }

    @Override
    public void setAuthentication(Authentication authentication) {
        this.authentication = authentication;
    }

    @Override
    public Operations getOperations() {
        return operations;
    }

    @Override
    public void setOperations(Operations operations) {
        this.operations = operations;
    }

    @Override
    public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {
        Properties propertiesFromYaml = loadYamlIntoProperties(resource);
        String sourceName = name != null ? name : resource.getResource().getFilename();
        return new PropertiesPropertySource(sourceName, propertiesFromYaml);
    }

    private Properties loadYamlIntoProperties(EncodedResource resource) throws FileNotFoundException {
        try {
            YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
            factory.setResources(resource.getResource());
            factory.afterPropertiesSet();
            return factory.getObject();
        } catch (IllegalStateException e) {
            // for ignoreResourceNotFound
            Throwable cause = e.getCause();
            if (cause instanceof FileNotFoundException)
                throw (FileNotFoundException) e.getCause();
            throw e;
        }
    }
}

Содержимое ApplicationXyzConfig. java

@Configuration
@SpringBootConfiguration
@EnableConfigurationProperties
@org.springframework.context.annotation.PropertySource("classpath:application-xyz.yml")
public class ApplicationXyzConfig implements ApplicationConfig, PropertySourceFactory {
    private Authentication authentication;
    private Operations operations;

    @Override
    public Authentication getAuthentication() {
        return authentication;
    }

    @Override
    public void setAuthentication(Authentication authentication) {
        this.authentication = authentication;
    }

    @Override
    public Operations getOperations() {
        return operations;
    }

    @Override
    public void setOperations(Operations operations) {
        this.operations = operations;
    }

    @Override
    public PropertySource<?> createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {
        Properties propertiesFromYaml = loadYamlIntoProperties(resource);
        String sourceName = name != null ? name : resource.getResource().getFilename();
        return new PropertiesPropertySource(sourceName, propertiesFromYaml);
    }

    private Properties loadYamlIntoProperties(EncodedResource resource) throws FileNotFoundException {
        try {
            YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
            factory.setResources(resource.getResource());
            factory.afterPropertiesSet();
            return factory.getObject();
        } catch (IllegalStateException e) {
            // for ignoreResourceNotFound
            Throwable cause = e.getCause();
            if (cause instanceof FileNotFoundException)
                throw (FileNotFoundException) e.getCause();
            throw e;
        }
    }
}

Содержимое ApplicationFactory. java

@Component
public class ApplicationFactory {
    @Autowired
    private ApplicationAbcConfig applicationAbcConfig;

    @Autowired
    private ApplicationXyzConfig applicationXyzConfig;

    public ApplicationConfig getApplicationPropertiesConfig(String application) {
        if (application.equalsIgnoreCase("abc")) {
            return applicationAbcConfig;
        } else if (application.equalsIgnoreCase("xyz")) {
            return applicationXyzConfig;
        } else {
            return null;
        }
    }
}

Содержимое YmlConfigurationSelection. java

public class YmlConfigurationSelection {

    @Autowired
    private ApplicationFactory applicationFactory;

    private ApplicationConfig applicationConfig;

    public Object accessingProperties(String application) {
        applicationConfig = applicationFactory.getApplicationPropertiesConfig(application);

        return null;
    }
}

Содержимое MultipleYmlDemoProject. java

@SpringBootApplication
@SpringBootConfiguration
@PropertySource(factory = ApplicationAbcConfig.class, value = "classpath:application-abc.yml")
@PropertySource(factory = ApplicationXyzConfig.class, value = "classpath:application-xyz.yml")
public class MultipleYmlDemoProject {

    public class MultipleYmlDemo {

        public static void main(String[] args) {
            ConfigurableApplicationContext ctx =
                    SpringApplication.run(YamlPropertysourceApplication.class, args);
            ConfigurableEnvironment env = ctx.getEnvironment();
        }
    }

}

1 Ответ

0 голосов
/ 17 февраля 2020

Похоже, у вас есть старое весеннее приложение, которое пытались перенести на весеннюю загрузку.

Весенняя загрузка изначально работает с файлами yaml, поэтому, если вы выполните интеграцию с помощью весенней загрузки, она будет можно удалить много шаблонного кода, который вы должны поддерживать. Также проблематично именование конфигураций c: имена application-<something>.yml зарезервированы для использования с профилями весенней загрузки, возможно, если вы переименуете в myprops-abc/xyz.yaml, это будет вести себя по-другому, я не могу сказать для конечно.

В целом, я предлагаю вам следующий способ, который намного лучше IMO:

  1. Оба набора конфигурации должны быть загружены в одну конфигурацию, поэтому создайте свойства конфигурации файл, обозначающий эту конфигурацию:

@ConfigurationProperties(prexix="security")
public class SecurityConfigProperties {

    private SecurityRealm abc;
    private SecurityRealm xyz;

    // getters, setters
}

public class SecurityRealm {
    private Authentication autentication;
    private Operations operations;
    // getters setters 
}

public class Authentication {...}
private class Operations {...}
Теперь поместите все содержимое из ab c и xyz yaml в один файл application.yaml и укажите префикс «security»:

security:
   abc:   // note, this 'abc' matches the field name of the configuration
     authentication: 
        ...
     operations:
        ....
   xyz:
     authentication: 
        ...
     operations:
        ....
ОК, все сопоставлено, создайте конфигурацию следующим образом:
@Configuration
@EnableConfigurationProperties(SecurityConfigProperties.class)
public class SecurityConfiguration {

    @Bean
    public SecurityBeanForABC(SecurityConfigProperties config) {
      return new SecurityBeanForABC(config.getAbc().getAuthentication(), config.getAbc().getOperations());
    } 

    ... the same for XYZ
}

Обратите внимание, что при таком подходе вы поддерживаете отображение конфигурации только в java объектах, и нет кода для загрузки. / разрешение свойств) - все делается при загрузке пружины автоматически. Если вы настраиваете специальный процессор аннотаций и имеете IDE спуска, вы можете получить даже средства автозаполнения для этих свойств yaml, но это выходит за рамки этого вопроса. Дело в том, что выполнение вещей способом, напрямую поддерживаемым весенней загрузкой, имеет много преимуществ:)

...